{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 文件存放位置：backtesting文件放入了期末作业题文件夹中，及与SampleTarget数据处于同一层目录\n",
    "# 代码思路：\n",
    "# 1.首先定义了函数daily_data：输入为期货品种的名称即需要的其他数据，输出为对应品种每日pnl、pnlnet和turnover的时间序列数据\n",
    "#   daily_data函数可以同时满足三个SampleTarget的计算要求，且考虑了目标持仓为nan时根据市场行情计算实际持仓的情况\n",
    "# 2.对于所有期货品种调用daily_data函数进行计算，结果汇总进三个df中：df_pnl,df_pnlnet和df_turnover其中列名为期货品种名称\n",
    "# 3.根据三个df中df_pnl,df_pnlnet和df_turnover计算策略整体的总收益曲线，以及计算sharpratio等指标\n",
    "\n",
    "# 其他：\n",
    "# 1.避免循环的方式：使用apply函数\n",
    "# 2.换手率计算时，换手金额取了绝对值\n",
    "# 3.AvgLeverage接近0的原因：同一时间内有多头有空头，相加会有所抵消"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取1m数据\n",
    "cwd = os.getcwd()\n",
    "#每个ft数据存在字典里\n",
    "df_dict = {}\n",
    "dir_path = cwd+'/1m'\n",
    "for dir_name in os.listdir('./1m'):\n",
    "    file_path = os.path.join(dir_path, dir_name)\n",
    "    df_dict[dir_name] = pd.read_feather(file_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#函数：对于每一个期货品种计算收益，输出每日结算的pnl,turnover和pnl_net\n",
    "def daily_data(ft_x,df_dict,sample,df_pnl,df_turnover,df_pnlnet):\n",
    "    '''\n",
    "    ft_x:每个期货品种的名称\n",
    "    df_dict:全品种1m数据的字典格式\n",
    "    sample:sampletarget数据\n",
    "    df_pnl:存放所有品种期货数据的pnl\n",
    "    df_pnlnet:存放所有品种期货数据的pnlnet\n",
    "    df_turnover:存放所有品种期货数据的turnover\n",
    "    '''\n",
    "    \n",
    "    sample = sample.dropna(axis=0,subset=[ft_x])\n",
    "    ft_xkey = ft_x + '.ft'\n",
    "    #两个df:clz_x放对应品种的每日收盘价；sample_mkt放对应品种交易时刻的价格\n",
    "    df_dict[ft_xkey].ffill(axis = 0,inplace = True)  #向前填充数据\n",
    "    clz_x = df_dict[ft_xkey].groupby(['trading_day']).last()   #取每天最后一个时刻的clz数据作为当日收盘价\n",
    "    clz_x['trading_day'] = clz_x.index\n",
    "    clz_x.index = [x for x in range(len(clz_x.index))]\n",
    "    clz_x = clz_x.loc[:,['trading_day','timestamp','clz']]\n",
    "    clz_x = pd.merge(sample,clz_x,on = 'trading_day',how='left')\n",
    "    clz_x = clz_x.loc[:,['trading_day','clz']]\n",
    "    clz_x['return'] = clz_x['clz']/clz_x['clz'].shift() - 1  #收盘价涨跌幅\n",
    "    sample_mkt = pd.merge(sample,df_dict[ft_xkey],how = 'left')\n",
    "    sample_mkt = sample_mkt.loc[:,['trading_day','timestamp',ft_x,'clz']]\n",
    "    sample_mkt = sample_mkt.rename(columns={\"clz\": \"price\"})   #sample_mkt里的clz实际上为交易时点的价格\n",
    "    sample_mkt['clz'] = clz_x['clz']      #当日收盘价合并进来（同时满足三个SampleTarget的return计算逻辑）\n",
    "    #根据数据每日结算（没有累计）：\n",
    "    sample_mkt[ft_x+'_pnl'] = sample_mkt[ft_x] * (sample_mkt['clz']/sample_mkt['price']-1) + sample_mkt[ft_x].shift() * (sample_mkt['price']/sample_mkt['price'].shift() - sample_mkt['clz'].shift()/sample_mkt['price'].shift()) \n",
    "    sample_mkt[ft_x+'_turnover'] = sample_mkt[ft_x] - sample_mkt[ft_x].shift() * (sample_mkt['price']/sample_mkt['price'].shift())\n",
    "    sample_mkt[ft_x+'_turnover'] = sample_mkt[ft_x+'_turnover'].abs()   #换手要取绝对值\n",
    "    sample_mkt[ft_x+'_pnlnet'] = sample_mkt[ft_x+'_pnl'] - np.abs(sample_mkt[ft_x+'_turnover'])*0.0003\n",
    "    df_pnl = pd.merge(df_pnl,sample_mkt.loc[:,['trading_day',ft_x+'_pnl']],on='trading_day',how='left')\n",
    "    df_turnover = pd.merge(df_turnover,sample_mkt.loc[:,['trading_day',ft_x+'_turnover']],on='trading_day',how='left')\n",
    "    df_pnlnet = pd.merge(df_pnlnet,sample_mkt.loc[:,['trading_day',ft_x+'_pnlnet']],on='trading_day',how='left')\n",
    "\n",
    "    return df_pnl,df_pnlnet,df_turnover"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAACGNklEQVR4nO3dd3hTZRsG8DtNR7pb6C6lAwpll1nKEJBCQRRQUcDBEFFBEKyKosgQFFT0w4GAIkNEQRBxF7BsKSB7ld1SVgejeyfn+6PNaU6TtElX0vb+XVcukve85+RJSZOn75QJgiCAiIiIyIxZmDoAIiIiooowYSEiIiKzx4SFiIiIzB4TFiIiIjJ7TFiIiIjI7DFhISIiIrPHhIWIiIjMHhMWIiIiMntMWIiIiMjsMWGpIplMhilTppg6DJOTyWSYO3euqcMgIqJ6igmLHqdPn8aIESPg7+8PhUIBX19fDBgwAF988YWpQzNIQEAAZDKZeLO3t0e3bt3w3XffVfqaf/31l9kmJb/99hs6deoEhUKBpk2bYs6cOSgqKjLo3MuXL2PEiBFwdXWFnZ0devXqhV27dumsGxcXh0GDBsHBwQGNGjXCs88+i9TUVKPj3b17t+T/p7xbbUtMTMRLL72EgIAA2NjYwMPDA8OHD8e///5b67HUhKq8V95//30MHToUnp6e5Sbpv/zyCyIjI+Hj4wMbGxs0adIEI0aMwJkzZ6rlNXz11VeQyWQICwurlutVZNy4cXBwcKiV56KK5efn480334SPjw9sbW0RFhaGHTt2GHz+zZs38eSTT8LFxQVOTk4YNmwYrl69qlVP32fSokWLqvPlGMzSJM9q5g4cOIB+/fqhadOmmDhxIry8vHD9+nUcPHgQn332GaZOnWrqEA0SGhqK1157DQBw+/ZtrFy5EmPHjkV+fj4mTpxo9PX++usvLF26VOeHdG5uLiwtTfN2+vvvvzF8+HD07dsXX3zxBU6fPo0FCxYgJSUFy5YtK/fc69evIzw8HHK5HG+88Qbs7e2xevVqDBw4EDExMXjggQfEujdu3MADDzwAZ2dnfPDBB8jKysLixYtx+vRpHD58GNbW1gbH3KpVK6xbt05SNnPmTDg4OOCdd94x7gdQjf7991889NBDAIDnn38erVu3RlJSEtasWYPevXvXqfe/LlV5rwDArFmz4OXlhY4dO2Lbtm16650+fRqurq6YNm0a3NzckJSUhFWrVqFbt26IjY1Fhw4dqvQ61q9fj4CAABw+fBiXL19G8+bNq3Q9qlvGjRuHzZs3Y/r06QgODsaaNWvw0EMPYdeuXejVq1e552ZlZaFfv35IT0/H22+/DSsrK/zvf/9Dnz59cOLECTRu3FhSf8CAARgzZoykrGPHjtX+mgwikJaHHnpIcHd3F+7fv691LDk5WfIYgPDyyy/XaDxZWVlGn+Pv7y8MGTJEUpaSkiI4ODgIrVq1qlQcL7/8smCOb5nWrVsLHTp0EAoLC8Wyd955R5DJZEJcXFy5506ePFmwtLQUzp8/L5ZlZ2cLfn5+QqdOnSR1J02aJNja2grXrl0Ty3bs2CEAEFasWFHl19GmTRuhT58+Vb6OmrHvm3v37gleXl6Cp6encPnyZcmxnJwcoXfv3oKFhYXw77//VluMhsjNzRWUSmW1XKsq7xVBEIT4+HhBEAQhNTVVACDMmTPH4OdOSkoSLC0thRdffNHYsCWuXr0qABC2bNkiuLu7C3Pnzq3S9QwxduxYwd7evsafp7pU5jOzrjh06JAAQPj444/FstzcXKFZs2ZCeHh4hed/+OGHAgDh8OHDYllcXJwgl8uFmTNnSurWxvebMdglpMOVK1fQpk0buLi4aB3z8PDQec7WrVvRtm1b2NjYoE2bNoiOjpYcv3btGiZPnoyWLVvC1tYWjRs3xhNPPIGEhARJvTVr1kAmk2HPnj2YPHkyPDw80KRJEwDA3LlzIZPJcP78eTz55JNwcnJC48aNMW3aNOTl5VX4utzd3RESEoIrV65Iyvft24cnnngCTZs2hY2NDfz8/PDqq68iNzdXrDNu3DgsXboUAHR2V+hqHj9+/DgGDx4MJycnODg4oH///jh48GCFcQLFLULnz59HYWFhufXOnTuHc+fO4YUXXpC08EyePBmCIGDz5s3lnr9v3z507NgRLVu2FMvs7OwwdOhQHDt2DJcuXRLLf/75Zzz88MNo2rSpWBYREYEWLVrgp59+Muh1GSMhIQEymQxr1qzROlb2561+b5w7dw5PPfUUXF1dxb+0AgIC8PDDD2P//v3o1q0bFAoFgoKCtLoHV6xYgaSkJHz88cdo1qyZ5JitrS3Wrl0LmUyG9957DwBw5MgRyGQyrF27Viu+bdu2QSaT4Y8//hDLbt68ieeeew6enp7i78mqVask56m7yjZs2IBZs2bB19cXdnZ2yMjI0Ptzqq33ClD8s6wsDw8P2NnZIS0trdLXAIpbV1xdXTFkyBCMGDEC69evF48VFhaiUaNGGD9+vNZ5GRkZUCgUeP3118Wya9euYejQobC3t4eHhwdeffVV8f9u9+7dRsd26NAhDBo0CM7OzrCzs0OfPn0kXYmbN28WP9/KWrFiBWQymaTb7Pz58xgxYgQaNWoEhUKBLl264LfffpOcV95npqGfuwBw6tQp9OnTB7a2tmjSpAkWLFiA1atXQyaTadX/+++/0bt3b9jb28PR0RFDhgzB2bNnDfoZXblyResz2BibN2+GXC7HCy+8IJYpFApMmDABsbGxuH79eoXnd+3aFV27dhXLQkJC0L9/f72fY7m5uQZ9x9Q0dgnp4O/vj9jYWJw5cwZt27atsP7+/fuxZcsWTJ48GY6Ojvj888/x+OOPIzExUWxe+++//3DgwAGMGjUKTZo0QUJCApYtW4a+ffvi3LlzsLOzk1xz8uTJcHd3x+zZs5GdnS059uSTTyIgIAALFy7EwYMH8fnnn+P+/fsVjk8pKirCjRs34OrqKinftGkTcnJyMGnSJDRu3BiHDx/GF198gRs3bmDTpk0AgBdffBG3bt3Cjh07tLoydDl79ix69+4NJycnzJgxA1ZWVlixYgX69u2LPXv2VNj3PnPmTKxduxbx8fHlfkkcP34cANClSxdJuY+PD5o0aSIe1yc/P1/r5wFA/P84evQogoODcfPmTaSkpGg9DwB069YNf/31V7nPU1ueeOIJBAcH44MPPoAgCGK5epzOhAkTMHbsWKxatQrjxo1D586d0aZNGwDA77//DoVCgSeffFLntQMDA9GrVy/s3LkTubm56NKlC4KCgvDTTz9h7NixkrobN26Eq6srIiMjAQDJycno3r27OEjd3d0df//9NyZMmICMjAxMnz5dcv78+fNhbW2N119/Hfn5+eV2t9XWe6Uy0tLSUFhYiKSkJCxZsgQZGRno379/la65fv16PPbYY7C2tsbo0aOxbNky/Pfff+jatSusrKzw6KOPYsuWLVixYoXk57Z161bk5+dj1KhRAIDs7Gw8+OCDuH37NqZNmwYvLy/88MMPesdvVWTnzp0YPHgwOnfujDlz5sDCwgKrV6/Ggw8+iH379qFbt24YMmQIHBwc8NNPP6FPnz6S8zdu3Ig2bdqIn7lnz55Fz5494evri7feegv29vb46aefMHz4cPz888949NFHJefr+sw09HP35s2b6NevH2QyGWbOnAl7e3usXLkSNjY2Wq9z3bp1GDt2LCIjI/Hhhx8iJycHy5YtQ69evXD8+PEKk1r1/7+upMkQx48fR4sWLeDk5CQp79atGwDgxIkT8PPz03muSqXCqVOn8Nxzz2kd69atG7Zv347MzEw4OjqK5WvWrMFXX30FQRDQqlUrzJo1C0899VSlYq8y0zbwmKft27cLcrlckMvlQnh4uDBjxgxh27ZtQkFBgVZdAIK1tbWkCf3kyZMCAOGLL74Qy3JycrTOjY2NFQAI3333nVi2evVqAYDQq1cvoaioSFJ/zpw5AgBh6NChkvLJkycLAISTJ0+KZf7+/sLAgQOF1NRUITU1VTh9+rTw7LPP6mzi0xXbwoULBZlMJun+KK9LCGWax4cPHy5YW1sLV65cEctu3bolODo6Cg888IDOa2gaO3asAEBsgtfn448/FgAIiYmJWse6du0qdO/evdzzH3nkEcHFxUXIyMiQlIeHhwsAhMWLFwuCIAj//fef1v+V2htvvCEAEPLy8ip4VeUr2yUUHx8vABBWr16tVbfsz1v93hg9erRWXX9/fwGAsHfvXrEsJSVFsLGxEV577TWxzMXFRejQoUO5Mb7yyisCAOHUqVOCIAjCzJkzBSsrK+HevXtinfz8fMHFxUV47rnnxLIJEyYI3t7ewp07dyTXGzVqlODs7Cy+B3ft2iUAEIKCgnS+L3WprfeKJkO7hFq2bCkAEAAIDg4OwqxZs6rUvXXkyBEBgLBjxw5BEARBpVIJTZo0EaZNmybW2bZtmwBA+P333yXnPvTQQ0JQUJD4+JNPPhEACFu3bhXLcnNzhZCQEAGAsGvXLrG8oi4hlUolBAcHC5GRkYJKpRLLc3JyhMDAQGHAgAFi2ejRowUPDw/J59vt27cFCwsL4b333hPL+vfvL7Rr107ye6VSqYQePXoIwcHBYll5n5mGfu5OnTpVkMlkwvHjx8Wyu3fvCo0aNZK8tzIzMwUXFxdh4sSJkmsmJSUJzs7OWuW6+Pv7C/7+/hXW06dNmzbCgw8+qFV+9uxZAYCwfPlyveeq37eaP2e1pUuXCgAk3eM9evQQlixZIvz666/CsmXLhLZt2woAhK+++qrS8VcFu4R0GDBgAGJjYzF06FCcPHkSH330ESIjI+Hr66vVHAkUdwtoNqG3b98eTk5OklHXtra24v3CwkLcvXsXzZs3h4uLC44dO6Z1zYkTJ0Iul+uM7+WXX5Y8Vg+CLPtX/vbt2+Hu7g53d3e0a9cO69atw/jx4/Hxxx9L6mnGlp2djTt37qBHjx4QBKFSf3UqlUps374dw4cPR1BQkFju7e2Np556Cvv37y+3iR8ozuoFQajwrxV1t5Wuv4QUCoWkW0uXSZMmIS0tDSNHjsTx48dx8eJFTJ8+HUeOHJFcv6Ln0axjSi+99JLO8tatW6N3797iY3d3d7Rs2VLyHi37l5Uu6uPq/7+RI0eisLAQW7ZsEets375d/JkCgCAI+Pnnn/HII49AEATcuXNHvEVGRiI9PV3rd2Ds2LGS92V5auu9UhmrV69GdHQ0vvrqK7Rq1Qq5ublQKpWVvt769evh6emJfv36ASjuGhw5ciQ2bNggXvfBBx+Em5sbNm7cKJ53//597NixQ/w/AYDo6Gj4+vpi6NChYplCoajUgPwTJ07g0qVLeOqpp3D37l3x/zc7Oxv9+/fH3r17oVKpABS/Z1JSUiRdTps3b4ZKpRLju3fvHnbu3Iknn3wSmZmZ4vXu3r2LyMhIXLp0CTdv3pTEoOsz09DP3ejoaISHhyM0NFQsa9SoEZ5++mnJ9Xbs2IG0tDSMHj1a8j6Wy+UICwszqHUqISGh0q0rQPH7uLKfQ8Z+jv3777+YNm0ahg4dipdeeglHjx5F27Zt8fbbb5vk844Jix5du3bFli1bcP/+fRw+fBgzZ85EZmYmRowYgXPnzknqao5pUHN1dcX9+/fFx7m5uZg9ezb8/PxgY2MDNzc3uLu7Iy0tDenp6VrnBwYG6o0tODhY8rhZs2awsLDQ+iVQT3WLjo7G4sWL4eLigvv372s1rycmJmLcuHFo1KgRHBwc4O7uLjbX6oqtIqmpqcjJyZGMC1Fr1aoVVCpVhf2shlJ/IOXn52sdy8vLq/BLb/Dgwfjiiy+wd+9edOrUCS1btsSff/6J999/HwDEqZwVPY9mHVPS974x5D3q6OiIzMzMcq+vPq5OXDp06ICQkBDJl+PGjRvh5uaGBx98EEDx+yEtLQ1ff/21mECrb+qxFikpKQa9jqqo6nulMsLDwxEZGYlJkyZh27Zt+P777zFz5sxKXUupVGLDhg3o168f4uPjcfnyZVy+fBlhYWFITk5GTEwMAMDS0hKPP/44fv31V/G1btmyBYWFhZKE5dq1a2jWrJnW1PnKzDhSj/UaO3as1v/xypUrkZ+fL36WqMe4lH3PhIaGokWLFgCKuzAFQcC7776rdb05c+YAMOw9Y+jn7rVr13S+7rJl6tf54IMPasW1fft2rZgqS6lUIikpSXIrKCgAUPw+ruznUFU/x6ytrTFlyhSkpaXh6NGjhr+gasIxLBWwtrYWByi1aNEC48ePx6ZNm8RfGgB6W0IEjTEEU6dOxerVqzF9+nSEh4fD2dkZMpkMo0aNEv/y0GTMh6e+tTrc3NwQEREBAIiMjERISAgefvhhfPbZZ4iKigJQ/IsxYMAA3Lt3D2+++SZCQkJgb2+PmzdvYty4cTpjMyfe3t4Aigdelu23vX37ttivW54pU6Zg/PjxOHXqFKytrREaGopvv/0WAMQPUM3nKev27dto1KiRzr9aqkLf/2t5f6Hre98Y8h5t1aoVjh8/jvz8fL2v5dSpU7CyspIkzSNHjsT777+PO3fuwNHREb/99htGjx4tDmxVv4eeeeYZrbEuau3btzfodVRFdbxXqsLV1RUPPvgg1q9fj8WLFxt9/s6dO3H79m1s2LABGzZs0Dq+fv16DBw4EAAwatQorFixQpzG/dNPPyEkJKTK06n1Uf8ff/zxx5JWCk3q5N/GxgbDhw/HL7/8gq+++grJycn4999/8cEHH2hd7/XXXxfHQZVVNpnQ9Z4x9nPX0Ne5bt06eHl5aR2vrqUdrl+/rpWA7dq1C3379oW3t7dW6xJQ+tnk4+Oj97rqzyl9n2MVnQ9A/N25d+9e+S+iBjBhMYJ6sJ6u/+yKbN68GWPHjsUnn3wiluXl5VVqxsClS5ckb+bLly9DpVJV2CQ+ZMgQ9OnTBx988AFefPFF2Nvb4/Tp07h48SLWrl0rmWuvaxEiQxcxc3d3h52dHS5cuKB17Pz587CwsNA7KMxY6g/HI0eOSL5wbt26hRs3bkhG0pfH3t4e4eHh4uN//vkHtra26NmzJwDA19cX7u7uYleRpsOHD+v9kK4K9WDgsu+Ra9euVftzAcDDDz+M2NhYbNq0Cc8884zW8YSEBOzbtw8RERGSL4eRI0di3rx5+Pnnn+Hp6YmMjAxxYCdQ/H5wdHSEUqkUE2hTqK73SlXk5uZWqtUSKE5IPDw8xNl6mrZs2YJffvkFy5cvh62tLR544AF4e3tj48aN4kDpsuv7+Pv749y5cxAEQfK7ffnyZaNjU3eJOzk5GfR/PHLkSKxduxYxMTGIi4uDIAiS1h91V7KVlVWV3jOGfu76+/vrfN1ly9Sv08PDo0bfy15eXlqfwepkMzQ0FLt27UJGRoZk4O2hQ4fE4/pYWFigXbt2Oj/HDh06hKCgoAq7hdXdyO7u7ga9lurELiEddu3aJfnLU009RkRXV0dF5HK51jW/+OKLSvVnl/3AUq++O3jw4ArPffPNN3H37l188803YlyA9C9tQRDw2WefaZ1rb28PQPsLtCy5XI6BAwfi119/lXRTJScn44cffkCvXr20RriXZehU1TZt2iAkJARff/215Ge5bNkyyGQyjBgxQixLT0/H+fPnK/zCOHDgALZs2YIJEybA2dlZLH/88cfxxx9/SLqzYmJicPHiRTzxxBPlXrMynJyc4Obmhr1790rKv/rqq2p/LqB4JpiHhwfeeOMNrVUv8/LyMH78eAiCgNmzZ0uOtWrVCu3atcPGjRuxceNGeHt7Sxbck8vlePzxx/Hzzz/rXOm1MisFazLle0UfXV0DCQkJiImJ0TnTrCK5ubnYsmULHn74YYwYMULrNmXKFGRmZopj7CwsLDBixAj8/vvvWLduHYqKiiQJAVDc6nrz5k3JuLy8vDzxs8EYnTt3RrNmzbB48WJkZWVpHS/7fxwREYFGjRqJ75lu3bpJ/gjz8PBA3759sWLFCp1/IBr6njH0czcyMhKxsbE4ceKEWHbv3j3JlHF1PScnJ3zwwQc632+GxGXItGaFQoGIiAjJTf0HzIgRI6BUKvH111+L9fPz87F69WqEhYVJ/hhMTEzE+fPnJdceMWIE/vvvP0nScuHCBezcuVPyOabrtWRmZmLJkiVwc3ND586dK3yt1Y0tLDpMnToVOTk5ePTRRxESEoKCggIcOHAAGzduREBAgM41Diry8MMPY926dXB2dkbr1q0RGxuLf/75R2tVQUPEx8dj6NChGDRoEGJjY/H999/jqaeeMqi5d/DgwWjbti0+/fRTvPzyywgJCUGzZs3w+uuv4+bNm3BycsLPP/8sGdugpn6DvvLKK4iMjIRcLpf8Ja1pwYIF2LFjB3r16oXJkyfD0tISK1asQH5+Pj766KMK4zR0qipQ3Aw9dOhQDBw4EKNGjcKZM2fw5Zdf4vnnn0erVq3Eer/88gvGjx+P1atXY9y4cQCKWyuefPJJDB06FF5eXjh79iyWL1+O9u3bS5qoAeDtt9/Gpk2b0K9fP0ybNg1ZWVn4+OOP0a5dO633hDrmqgyuA4pXm120aBGef/55dOnSBXv37sXFixerdE19GjdujM2bN2PIkCHo1KmT1kq3ly9fxmeffYYePXponTty5EjMnj1bXA/CwkL6t9CiRYuwa9cuhIWFYeLEiWjdujXu3buHY8eO4Z9//qlS83JtvVeA4q6Aa9euIScnBwCwd+9eLFiwAADw7LPPwt/fHwDQrl079O/fH6GhoXB1dcWlS5fw7bfforCwUGtZ83HjxlUY/2+//YbMzEzJAFlN3bt3h7u7O9avXy8mJiNHjsQXX3yBOXPmoF27dpLXBxQnqF9++SVGjx6NadOmwdvbG+vXrxcHX5ZtUS0sLBRfq6ZGjRph8uTJWLlyJQYPHow2bdpg/Pjx8PX1xc2bN7Fr1y44OTnh999/F8+xsrLCY489hg0bNiA7O1tnF9nSpUvRq1cvtGvXDhMnTkRQUBCSk5MRGxuLGzdu4OTJkzp/FpoM/dydMWMGvv/+ewwYMABTp04VpzU3bdoU9+7dE38WTk5OWLZsGZ599ll06tQJo0aNgru7OxITE/Hnn3+iZ8+e+PLLL8uNqarTmsPCwvDEE09g5syZSElJQfPmzbF27VokJCSIXdlqY8aMwZ49eyRJ2+TJk/HNN99gyJAheP3112FlZYVPP/0Unp6e4sroQPHPf+vWrXjkkUfQtGlT3L59G6tWrUJiYiLWrVtn1Mre1abW5yXVAX///bfw3HPPCSEhIYKDg4NgbW0tNG/eXJg6darBK936+/sLY8eOFR/fv39fGD9+vODm5iY4ODgIkZGRwvnz57Xqqafo/ffff1rXVE9dPXfunDBixAjB0dFRcHV1FaZMmSLk5uZqPX/ZlW7V1qxZI5kue+7cOSEiIkJwcHAQ3NzchIkTJ4pTszWn1BYVFQlTp04V3N3dBZlMJpniDB1TPI8dOyZERkYKDg4Ogp2dndCvXz/hwIEDOmMqy9Cpqmq//PKLEBoaKtjY2AhNmjQRZs2apTUNXf2z1XxN9+7dE4YNGyZ4eXkJ1tbWQmBgoPDmm29qTXNWO3PmjDBw4EDBzs5OcHFxEZ5++mkhKSlJq56bm5tR02QFQfdKtzk5OcKECRMEZ2dnwdHRUXjyySeFlJQUvdOaU1NTta6r773Qp08fnSvrxsfHCxMnThSaNm0qWFlZCW5ubsLQoUOFffv26Y390qVL4vTd/fv366yTnJwsvPzyy4Kfn59gZWUleHl5Cf379xe+/vprsY56WvOmTZv0PldZtfVeEYTin5n6dZa9aU4DnjNnjtClSxfB1dVVsLS0FHx8fIRRo0aJ08E1Pf7444Ktra3OlbXVHnnkEUGhUAjZ2dl664wbN06wsrISp46rVCrBz89PACAsWLBA5zlXr14VhgwZItja2gru7u7Ca6+9Jvz8888CAOHgwYNiPfXPWNetWbNmYr3jx48Ljz32mNC4cWPBxsZG8Pf3F5588kkhJiZG67nVq0TLZDLh+vXrOuO7cuWKMGbMGMHLy0uwsrISfH19hYcffljYvHmzWKe8z0xDP3fVsffu3Vt8XyxcuFD4/PPPBQBav+O7du0SIiMjBWdnZ0GhUAjNmjUTxo0bJxw5ckTn69BU1WnNglA8/fz1118XvLy8BBsbG6Fr165CdHS0Vj31+7Ws69evCyNGjBCcnJwEBwcH4eGHHxYuXbokqbN9+3ZhwIAB4s/excVFGDhwoM7/y9oiEwQdfR9klubOnYt58+YhNTUVbm5upg6H9Dh37hzatGmDP/74A0OGDDF1OGTmPD09MWbMGK3lBkxlyZIlePXVV3Hjxg34+vqaOhyTmj59OlasWIGsrCy9A9ep9nAMC1E127VrF8LDw5msUIXOnj2L3NxcvPnmmyZ5/rJraeTl5WHFihUIDg5ucMlK2Z/F3bt3sW7dOvTq1YvJipngGBaiavbyyy9rLe5HpEubNm0qXESxJj322GNo2rQpQkNDkZ6eju+//x7nz5/XGmzaEISHh6Nv375o1aoVkpOT8e233yIjIwPvvvuuqUOjEkxYiIgaqMjISKxcuRLr16+HUqlE69atsWHDBq0ZRQ3BQw89hM2bN+Prr7+GTCZDp06d8O2330pmvJFpVWoMy9KlS/Hxxx8jKSkJHTp0wBdffKF30aUtW7bggw8+wOXLl1FYWIjg4GC89tprePbZZ8U66lHymiIjI7V2PCYiIqKGyegWlo0bNyIqKgrLly9HWFgYlixZgsjISFy4cAEeHh5a9Rs1aoR33nkHISEhsLa2xh9//IHx48fDw8NDsoLhoEGDsHr1avFxda8aSkRERHWX0S0sYWFh6Nq1qzjXXKVSwc/PD1OnTsVbb71l0DU6deqEIUOGYP78+QCKW1jS0tKwdetW46InIiKiBsGoFpaCggIcPXpUsnmXhYUFIiIiEBsbW+H5giBg586duHDhAj788EPJsd27d8PDw0Pcb2PBggV6F1XLz8+XbN6kUqlw7949NG7c2ODl44mIiMi0BEFAZmYmfHx8tBacLMuohOXOnTtQKpXw9PSUlHt6emot/6spPT0dvr6+yM/Ph1wux1dffYUBAwaIxwcNGoTHHnsMgYGBuHLlCt5++20MHjwYsbGxOqeTLVy4EPPmzTMmdCIiIjJT169fR5MmTcqtUyuzhBwdHXHixAlkZWUhJiYGUVFRCAoKQt++fQFAsrx7u3bt0L59ezRr1gy7d+8WlzHWNHPmTHG3YaA4IWratCmuX79e4R41REREZB4yMjLg5+dX4aaLgJEJi5ubG+RyOZKTkyXlycnJOrfaVrOwsBC3Ag8NDUVcXBwWLlwoJixlBQUFwc3NDZcvX9aZsNjY2OgclOvk5MSEhYiIqI4xZDiHUSvdWltbo3PnzoiJiRHLVCoVYmJiEB4ebvB1VCqVZAxKWTdu3MDdu3fh7e1tTHhERERUTxndJRQVFYWxY8eiS5cu6NatG5YsWYLs7Gxxt9oxY8bA19cXCxcuBFA83qRLly5o1qwZ8vPz8ddff2HdunVYtmwZACArKwvz5s3D448/Di8vL1y5cgUzZsxA8+bNJdOeiYiIqOEyOmEZOXIkUlNTMXv2bCQlJSE0NBTR0dHiQNzExETJSN/s7GxMnjwZN27cgK2tLUJCQvD999+LKynK5XKcOnUKa9euRVpaGnx8fDBw4EDMnz+fa7EQERERgEqudGtuMjIy4OzsjPT0dL1jWARBQFFREZRKZS1HR2XJ5XJYWlpyCjoRUQNnyPe3WoPYS6igoAC3b99GTk6OqUOhEnZ2dvD29oa1tbWpQyEiojqg3icsKpUK8fHxkMvl8PHxgbW1Nf+yNyFBEFBQUIDU1FTEx8cjODi4wsWCiIiI6n3CUlBQIG4fYGdnZ+pwCICtrS2srKxw7do1FBQUQKFQmDokIiIycw3mT1v+FW9e+P9BRETG4LcGERERmT0mLERERGT2mLDUYwkJCZDJZDhx4oSpQyEiIqoSJixUrWQyGbZu3WrqMIiIqJ5hwkJERFTPFSpVWLnvKs4nZRhUv0ipwtFr91GoVNVwZIZrkAmLIAjIKSgyyc2YhYX79u2LKVOmYMqUKXB2doabmxveffdd8RoBAQH44IMP8Nxzz8HR0RFNmzbF119/Xamfye7duyGTyRATE4MuXbrAzs4OPXr0wIULFyT1fv31V3Tq1AkKhQJBQUGYN28eioqKxHgA4NFHH4VMJhMfExGRaa3aH48Ff8Zh0JJ9BtX/ZMdFPL7sAD7ZfrGGIzNcvV+HRZfcQiVaz95mkuc+914k7KwN/7GvXbsWEyZMwOHDh3HkyBG88MILaNq0KSZOnAgA+OSTTzB//ny8/fbb2Lx5MyZNmoQ+ffqgZcuWlYrvnXfewSeffAJ3d3e89NJLeO655/Dvv/8CAPbt24cxY8bg888/R+/evXHlyhW88MILAIA5c+bgv//+g4eHB1avXo1BgwZBLpdXKgYiIqpexxPTDK77UfR5LNt9BQCwfM8VvDU4pIaiMk6DbGGpS/z8/PC///0PLVu2xNNPP42pU6fif//7n3j8oYcewuTJk9G8eXO8+eabcHNzw65duyr9fO+//z769OmD1q1b46233sKBAweQl5cHAJg3bx7eeustjB07FkFBQRgwYADmz5+PFStWAADc3d0BAC4uLvDy8hIfExGRaSkNbN2/lZaLr0qSFXPTIFtYbK3kOPdepMme2xjdu3eXbCUQHh6OTz75RNzEsX379uIxmUwGLy8vpKSkVDo+zet5e3sDAFJSUtC0aVOcPHkS//77L95//32xjlKpRF5eHnJycriSMBGRmTJkOEJugRI9Fu3UKj95PQ0d/FxqICrjNMiERSaTGdUtY86srKwkj2UyGVSqyg+S0ryeOlFSXy8rKwvz5s3DY489pnUel9cnIjJfSlXFCcvCv+N0lr/3xzn8PKlHdYdktPrxrV2PHTp0SPL44MGDCA4ONsn4kE6dOuHChQto3ry53jpWVlZi6w8REZkHpUa+IgiCzk2Afz95S7xvbWmBgqLiP1b7tjCP7n2OYTFziYmJiIqKwoULF/Djjz/iiy++wLRp00wSy+zZs/Hdd99h3rx5OHv2LOLi4rBhwwbMmjVLrBMQEICYmBgkJSXh/v37JomTiIikVBotLD0W7cTc385q1XFQlLZhxET1weOdmgAArCzNI1UwjyhIrzFjxiA3NxfdunXDyy+/jGnTpokzc2pbZGQk/vjjD2zfvh1du3ZF9+7d8b///Q/+/v5inU8++QQ7duyAn58fOnbsaJI4iYhISrNL6HZ6HtYcSJAcFwQBuQXFreO/vtwTfo3soLAqThHyCs2j1ZxdQmbOysoKS5YswbJly7SOJSQkaJVpLsMfEBBg8Lovffv21aobGhqqVRYZGYnISP0Dlh955BE88sgjBj0nERHVDl0LwGXlF8HBxhIr913F/3ZcRHZJwuJsWzyWUVEySSSv0DwWj2MLCxERUT2nK2HZdzEVABATlyImKwBgU9KyYismLObRwsKEpYF46aWX4ODgoPP20ksvmTo8IiKqQQVK7db2SeuP4XJKJlRlWtKdFOoWltIuobjbGWKXkamwS8iM7d69u9qu9d577+H111/XeczJyananoeIiMyPvj2BFv19HvlFpceauNrC3qY4NVD/G38nG89+ewiudtZYPb4rmriaZs0tJiwNhIeHBzw8PEwdBhERmYC+hMXa0kJMWKY+2Byv9A8Wj7nYFbe0HIq/BwBwVFjBzcGmhiPVr8F0CRmz6SDVPP5/EBHVnsIi3QlLY3sb5BYUb2D7QAt3WMlL0wIXO2tJ3T4t3MWBuKZQ7xMW9cqtOTk5Jo6ENKn/P8qu1EtERNWvQE8Li5uDDbLyixMWBxtpp4trmYTF0kJ7sbnaVO+7hORyOVxcXMT9dezs7HSu8Ee1QxAE5OTkICUlBS4uLtzRmYioFtzJKtBZrlSpxGPaCYv0D0q5nAlLjfPy8gKAKm0KSNVLvaMzERHVLHULii6f77ws3rcvk7CU7RKSm/iP/QaRsMhkMnh7e8PDwwOFhYWmDqfBs7KyYssKEVEtuZCUaVA9exvp57JjmQRGzi6h2iOXy/lFSUREDYxhkxxsLKXfjxZlEpQcE6/DUu8H3RIRETVkKh35inpRuIq8EdlSvF+kZ+BubWHCQkREVI/pWkWi7HiUp8Oa6jz35X7Nxfs/Hr5erXEZq0F1CRERETU0ZZfeByDZO+i5noGY/UjrCq+jb2p0bWELCxERUT1W0Tqdo7r5GXSdcT0Cqh5MFTBhISIiqseUOgaxPNvdX7xva+DqtUPae1dbTJXBLiEiIqJ67FZarlZZr2A3rDt4DUDF05V/nhSOK6nZ6BrQqEbiMxQTFiIionomr1CJKT8cQ49mbnjvj3Nax11sS1extaxgBdvO/o3Q2d+0yQrAhIWIiKje+fXETfwTl4J/4nSv8O6kmbBY1I3RIXUjSiIiIjLYvezyV3XX3DfI1EvuG4oJCxERUT2TXc7+QUDxLs1qNgYuImdqlYpy6dKlCAgIgEKhQFhYGA4fPqy37pYtW9ClSxe4uLjA3t4eoaGhWLdunaSOIAiYPXs2vL29YWtri4iICFy6dKkyoRERETV46bnlt7DYWsvxy+Qe+HlSDygMnCVkakYnLBs3bkRUVBTmzJmDY8eOoUOHDoiMjNS7E3KjRo3wzjvvIDY2FqdOncL48eMxfvx4bNu2Tazz0Ucf4fPPP8fy5ctx6NAh2NvbIzIyEnl5eZV/ZURERA1U2YSlf4gHPJ1sJGUdm7qis79rbYZVJUYnLJ9++ikmTpyI8ePHo3Xr1li+fDns7OywatUqnfX79u2LRx99FK1atUKzZs0wbdo0tG/fHvv37wdQ3LqyZMkSzJo1C8OGDUP79u3x3Xff4datW9i6dWuVXhwREVFdlpyRhz0XUyFUtPpbGWllEpZOdSgx0ceohKWgoABHjx5FRERE6QUsLBAREYHY2NgKzxcEATExMbhw4QIeeOABAEB8fDySkpIk13R2dkZYWJjea+bn5yMjI0NyIyIiqk+UKgFhH8Rg7KrD2Hledy+GPnez8iWPOzZ1QXJGvp7adYNRCcudO3egVCrh6ekpKff09ERSUpLe89LT0+Hg4ABra2sMGTIEX3zxBQYMGAAA4nnGXHPhwoVwdnYWb35+hi0rTEREVFcs/CtOvL/v0h2jzr1TJmEpKDLtPkDVoVaGBjs6OuLEiRP477//8P777yMqKgq7d++u9PVmzpyJ9PR08Xb9uml3kCQiIqpuK/fHi/dtLA3/ulapBNzNKhAfO9pYmnyV2upg1MJxbm5ukMvlSE5OlpQnJyfDy8tL73kWFhZo3rx4i+rQ0FDExcVh4cKF6Nu3r3hecnIyvL1L9ylITk5GaGiozuvZ2NjAxsZG5zEiIqL6xlFh+Nd1em4hikr2Dzo/fxAA1JmZQOUxqoXF2toanTt3RkxMjFimUqkQExOD8PBwg6+jUqmQn1/cXBUYGAgvLy/JNTMyMnDo0CGjrklERFRfWRvRwpJa0h3kbGsFhZW8XiQrQCWW5o+KisLYsWPRpUsXdOvWDUuWLEF2djbGjx8PABgzZgx8fX2xcOFCAMXjTbp06YJmzZohPz8ff/31F9atW4dly5YBAGQyGaZPn44FCxYgODgYgYGBePfdd+Hj44Phw4dX3yslIiKqo4p07Lisz53M4oTF3bF+9UQYnbCMHDkSqampmD17NpKSkhAaGoro6Ghx0GxiYiIsNPYlyM7OxuTJk3Hjxg3Y2toiJCQE33//PUaOHCnWmTFjBrKzs/HCCy8gLS0NvXr1QnR0NBQKRTW8RCIiorql7DRmpdLwhEXdwuLmYF2tMZmaTDB2crcZysjIgLOzM9LT0+Hk5GTqcIiIiKokK78IbeeULrA6rX8wXh3QwqBzv90fj/l/nMPD7b3x5VOdxPKAt/4U7ycsGlJ9wVaBMd/fdWMDASIiogYkJUO60nuRyrBpySqVgO1ni5cE0dwvqD5gwkJERGRmktLLJiyGdYZ8f+gaDsXfA1D/uoSYsBAREZmZpLItLAaOYVl7IEG872zHhIWIiIhq0O0yLSxKA1tYnG2txPt2ZaYzj+7WFADwbHf/KkZnGkbPEiIiIqKalVzJMSxOmgmLtTRheW9YGzzeyRcd/FyqHJ8psIWFiIjIzKhbWDydigfOGtol5KgoTVhkMpnkmJXcAl0CGsFKXje/+utm1ERERPWYuoWliasdAMMH3colOUqdX7VEggkLERGRmVG3sDRxtQVg+BiWAmVp11HdX2VNigkLERGRGUnOyENqyfL66oSlUGnYGJbsfKV4v6WXY/UHZ0JMWIiIiMzI1B+Oi/c9nYq3qDGkhaWgSIW9l1IBABN7ByLI3aFmAjQRJixERERm5HxShnjfumSAbEFRxS0sL647InYD9WvpUSOxmRITFiIiIjOiOcBWUbKWSl6RUl910a4LqeJ9zdlC9QUTFiIiIjOiOYVZYVX8Nf3v5bu4n11Q7nndAhuJ9+1s5OXUrJuYsBAREZkRzUXirC1Lv6YPXLmL9YeuYeiX+8VBuWpZ+UU4XLKHkK2VHEFu9rUTbC1iwkJERGRGNMfX9mjmJt7PLVTinV/O4NSNdHwWcxFA8eyhWVtPo+2cbWK9kV39tBaNqw+YsBAREZW4mJyJu1n5FVesQc90byreV1jJMbC1JwBIuoSy8oow+9czCH7nb3x/MFFyfv9W9W/ALcC9hIiIiAAAV1OzMPB/e+HtrEDszP4mi0O9geG4HgEAAJuSgbdnbqWLdfZeuoN7esa09GruprO8rmMLCxEREYCYuBQAxavMZuUXmSyO6/dyAQBOiuI2BUXJOJab93PFOo4K/e0N9bE7CGDCQkREBAB4/6848X7bOdvQ68OdOJ54X1JHqOH17ouUKvx28hYAoJG9NQDApmSm0A2NhOXa3Ryd5/dr6V6j8ZkSu4SIiKhB23MxFYn3tBOAG/dz8ehXB5CwaAgAYMbmkzhxPQ2/Teklro9S3TLzSlt25BbFLSUKy+LnSirZELEsb2cFPh/dEa521vBvbFcjcZkDJixERNRgCYKAsasOl1vn5PU0dPBzwU9HbgAoTnAi23jVSDyFGlOa3R1tAADxd7L11re1kpt0vE1tYpcQERE1WBm5FY9VGbb0X0lXkLwGx4jkF5YmLBGtimcH+bjY6q3/25SeNRaLuWHCQkREdZYgCPhy5yVsO5tUqfOv39fuCurY1EWr7EpqlnhfczG36pZfsgS/i50VLEv2EZoeEayzbv8QDwR71q8dmcvDLiEiIqqTos/cxhubT4njPtRjTYyRcFfa3TKqqx8Gt/PGX6du47FOvhj59UEAwJ+nShMiK3nNJSz3sgsBAC62pXsBNXawQaifC05cTxPL/BvbYcmo0BqLwxwxYSEiojpHqRLw0vfHJGWCIBg1pfdOVj6m/HBcfHzlg4fEga59WhTPtnlzUAg+jD6P//1zUfI8NSUls3hgrYejQlL+w8QwtJ5dupptTFQfsQWmoWDCQkREdcqcX89gbew1rfKMvCJx0TVD/Hrilnj/wRAPMVnR1ElH91ChquYSluSM4lV2PZxsJOV21qVf179N6dngkhWACQsREZlIQZGqUuNBdCUrAJCWU2BUwmKrMTU5K0/34FsHHQu0FSlVOmoWb0C4+ch1DG7nDU8nhc46FZn/xzkAgJuDjdaxhEVDjG5Fqk8aXopGREQmF33mNlrPjsYvx28YdZ6+5egB4H5OoVHXUliVfgXe0DH4FgCcFNoJUKFSdwvLnF/PYu7v5/DUNweNikMXXevCAPV3FVtDMGEhIqJa99L3x1CkEvDqxpNGndf/k916j93JrHjTQkEQ8Oep20jJzEPslbtiefegxjrrezlrt5Rs+C9RR02IM5WupOpfN6Wi2NTsrGtmYbq6jF1CRERk1q6mZiGvUIXMvMJyW1HO3spARMnOxrokZ+Thy52Xse6gdpfSiC5NdJ6ja0bQ7gupSM3MFxd2U6vq/kMFGl1Ng9rWzMJ0dRkTFiIiMluCIODBT/boPPbiA0FYsfeq+Pjc7XSd9QDg0NW74hRlXXo007/D8aiuftjw33VJ2Y5zyXgqrKnecyoz1iS/qDRhGVBO4tVQsUuIiIjMluaXuKZxPQLw1uAQSVlShv4uoadWHtJ7zKaCgb8fPNpOq+x+jv6xNACw9cTNco/rornKrXUDnAVUEf5EiIjIbC3U2EFZ7bmegZj9cGvIZDIM1GiJOHk9Dff1DMpVljMV+bNRHcuNwULHdOf03OKuqSKlCq9vOolPt1+QHF+nZyZTedSr3NpYWjTowbX6MGEhIqJa9e/lOwbVO3k9TecU5oFtPMUk4usxXXBkVoR4rOP8HXh14wm8semkmLyUt9Bbr+ZuBo0XWTIyVPL4671XUVCkwlPfHMLmozfw+c7LkuOVma6tnhmkr1WpoeMYFiIiqlVPl9M9o5aVX4RhS/8VH3fwc0Hnpq7wdLJBWGAjSd2ya5b8cry4Oya3UIkvn+pU7gaHy57pZFDMwzv6YlioD344nIh3fjkDAPjgrzgcTrins76u6dAV+TD6QsWVGjC2sBARkVlQt4TczcrH1B+ky+5n5xdh9iOt8WKfZjq7S6Kn99YuO5MEQRBwMy1X73M62Bj+d7tMJkNPjcG5aw4k6K3bztfZ4OuqOelYpI5KMWEhIiKTUQ8PeevnU+j14S6k5xZi8vpj2HUhVVIvJSOv3OuEeDlhxqCWkrIilYAPoy/g+PX7es8zdqxIgJu9QfWKKrF8/75LxV1lHZoYn+w0BJVKWJYuXYqAgAAoFAqEhYXh8OHDeut+88036N27N1xdXeHq6oqIiAit+uPGjYNMJpPcBg0aVJnQiIioDlEJxUv0b/jvOm6m5WLb2SQcitfuZsnQs3S+Jl3L8i/fc0Xswuns76pzyXtjzXmkteTxmHB/8X5bXycAQJGq8uNQUgxYAK8hMjph2bhxI6KiojBnzhwcO3YMHTp0QGRkJFJSUnTW3717N0aPHo1du3YhNjYWfn5+GDhwIG7elE75GjRoEG7fvi3efvzxx8q9IiKiOqhQqcJP/13H1dQsU4dSo1Q6Wh4S71VuZdiyHu/UBC/1aYZNL4WjX0t3reOudtbYN6MfLr0/GB+NaI+dr/Wp1PMM7eAjefxw+9LHIV7FCYu+5fsNYSnnDCFdjO4w+/TTTzFx4kSMHz8eALB8+XL8+eefWLVqFd566y2t+uvXr5c8XrlyJX7++WfExMRgzJgxYrmNjQ28vLiyHxE1TF/uvIzPYi6hd7Ab1k0IM3U4NUZXV8n5pEzxvr6un0+e6FDhtRVWcnFtlme6+yPhbg7uZReIU5BtreWwLVny/skufkbHrtZYo5Xm/UfboltgI3w7tguKVAJOXk8DUJyAVtbcR9pU+tz6zKiEpaCgAEePHsXMmTPFMgsLC0RERCA2Ntaga+Tk5KCwsBCNGklHee/evRseHh5wdXXFgw8+iAULFqBxY917O+Tn5yM/v7TJLCMjw5iXQURkdtRTfdXjGOorXeuh3LhfOih28faLkmNfP9sZ/UI8dC6RX57+rTzRv5UnVv8bj3m/F++AHNHKoxIR65awaAiKlCpYlsTVv1XxejDnbhV/HxmbsChVAmQyQBCA9k1cqi3O+sSod8CdO3egVCrh6SldMtjT0xNJSUkGXePNN9+Ej48PIiJK580PGjQI3333HWJiYvDhhx9iz549GDx4MJRKpc5rLFy4EM7OzuLNz6/ymTIRkTnQtThZfaRrbMftcmbxeDopjE5WNI3uVrp8fq/m+pffrwxLHXFZlXTnFJXTJZSRV4hxqw9jy7HinaqvpmZhXWwCBAGQyQBXO+OnRDcEtTqHatGiRdiwYQN2794NhaJ0B8xRo0aJ99u1a4f27dujWbNm2L17N/r37691nZkzZyIqKkp8nJGRwaSFiOo0zXxFqRIgr6cJjGYLi8LKAnmFKp2Lw6mPt/FxqtLzKazkiF/4EIpUQpUSH0Opn6OgnBaW30/ewu4Lqdh9IRWPdWoi2SvJ2dZKZyJERiYsbm5ukMvlSE5OlpQnJydXOP5k8eLFWLRoEf755x+0b9++3LpBQUFwc3PD5cuXdSYsNjY2sLGp+khvIiJzoZmgfBR9HjMfamXCaGqO5hiWsMDG2HNROn35i9EdMaitF9JzC6tlRg9QPHXZqpYGsqqTjfJaWA5dLZ0FlVMgnf30SHufstWphFFpnLW1NTp37oyYmBixTKVSISYmBuHh4XrP++ijjzB//nxER0ejS5cuFT7PjRs3cPfuXXh7exsTHhFRnZWlMW33eGKa6QKpYeoWFksLmc6uj0c6+MBKblFtyUptsy5JjPSNYREEAb+dvCU+bj17m+T465Ety55CJYxud4qKisI333yDtWvXIi4uDpMmTUJ2drY4a2jMmDGSQbkffvgh3n33XaxatQoBAQFISkpCUlISsrKKp+5lZWXhjTfewMGDB5GQkICYmBgMGzYMzZs3R2RkZDW9TCIi89bBz0W8b2NVf7sE1C0scgsZXOysTRxN9VO3sOib1pxUwQJ4utaSoWJGj2EZOXIkUlNTMXv2bCQlJSE0NBTR0dHiQNzExERYWJT+si1btgwFBQUYMWKE5Dpz5szB3LlzIZfLcerUKaxduxZpaWnw8fHBwIEDMX/+fHb7EFGDYaOxWV5BPd78TqksbWFxKdPCsva5bqYIqVqpx7DoWzguO1//AniaC9CRtkoNup0yZQqmTJmi89ju3bsljxMSEsq9lq2tLbZt21ZuHSKi+k6zB6G8AZt1nfqLXG4hg4tGa8InT3RAnxbai73VNVYaXUKxV+5i9q9n8MFj7dA1oHgpj5wC3bNf3xvWBqO6NtV5jIrV33ZHIqI6RKnxF3l+Yf1NWMQxLHILuNqXdgk183AwVUjVSt3CkpWvxLzfz+JSShaeWF66Tpmu8UnfjOmCMeEBsLbkV3J5uDUkEZGJFCpVsJDJILeQ4U52gVhev1tYSsewaM6MCjRwU0FzZ1nymtQr3qql5RTg420XsP5QotY5RfX4/7s6MWEhIjKBgiIV+i3eDXdHG2x9uSf+PHVbcqy+Uk/3lctkCGhcmqTUl8GmrfWsGzNs6b+4djdH57FugY10lpMUExYiIhOIu52Bm2m5uJmWi0NX70qO5ReVjnNQqgR8F5uAll6O6NGseldqNYXMvOJ9fRwVlmjr64xvxnRBoJudiaOqPk1cdb8WfcnKe8PaSPYmIv2YsBARmUC+RivKyK8PSo7lagzM/GT7BXy1+wqcba1wYvYAyGR1ewXceznFXV/q8SsDWnuWV71Oevfh1pj/xzm9x/+Y2guBbvZIzcxHQD3pCqsNHOFDRGQCeYW6Z4tYWsiQkVeEG/dz8F/CPXy1+woAID23EC99f1RsoSjrZlouPo+5hPvZBUjPKUSrd6Ox5t/4Gou/su6XjNWpz/vlTOgViPPzB2H1uK4Y0k66AOrq8V3R1tcZ9jaWTFaMxISFiMgEyi7JDgC9g93Q1tcZAPBfwj3sPJ8iOb7tbDK2nrildR4AvLrhBD7dcREv/3AMHd7bjtxCJeaW7FKcX6TUmyBVNvboM0lIzsjDwat3IQjF41LyCpUYtGQv3vnltN5z7+cUJ1yN7OvfonGaFFZy9AvxwP9GhkrK/VxtTRNQPcCEhYjIBDLytBOWjk1dEVwyvfd2eh4ycrVbU97dekZnsnM4oXh/mgNXpONhdp5PRstZ0Qh5Nxo3y9kV2RgzNp/CS98fRdgHMRj19UGMWXUYALDtbBLOJ2XqnAmjdk9sYanfCYuataUFhoeW7g/U3MPRhNHUbUxYiIhMoGwyYiEDpj7YXFyLo6BIhSw9q6JuOXYTAJCckae3jtpza46I92PLJDOVoVQJ+ENjRhMA7Lt0B/lFSpy5mV7h+Wk5DSthAYAlozrin6g+OP7uAFOHUqdx0C0RkQmUbWHp19IDVnIL2FjKARQPys3U0QoDANfv5eDG/Rz0+nAXAODy+4MNe04dLTbGGvV1rM7ylIx8fLOv4jEz6i6hssvy13fN68nCeKbEhIWIyATKJg/+JWuSqFtYlpUMtgWAtwaH4HZaLtbGXgMArNh7VVyADYBBiQJQ/j42QPEYFBtLi3JnIv2XcF9n+S0Du5vULUKOioaVsFDVsUuIiMgEynbljO8ZAABQ6NipubW3E+YNa4sVz3YWy77dX5qkbDubZNBzZuvZxwYA1h28hpB3ozFr6xmDrlVW2anZemMoed32NvJKPQ81XExYiIhMoOxqtuqWFU8nhVZd9XLvHZu66LzWhaRMAMWJzdKnOuGV/sHoVrLZXmN7awwrGfT5w6FreuN5tyRRKW/ALAC4ORg29mT3hRSd5dkF6oSFDfxkHCYsREQmoJWwlGya92hHX0m5TAa0bVI81bmxve4VUXNLpiy7O9pgSHtvRA1ogQ0vdEfce4Nw8O3+OHWjeDBsRl4RPow+j7O3yh8cu0tPsiEIgjgGRc3HWTvBAoBv9l3VWZ6TXxyrvTUTFjIOExYiIhMoLLPhnVxe3IqisJIjYdEQnJ0XifiFD+HigsFwKhnvIbeQ4dWIFnqveTj+nnjfwkIGW2s5rOQWeH1gS7F82e4rGPL5fly/l4OrqVl49ttD+PXETcl1/j4tnQWklpFXJO62/O7DrdGpqQs2vhiOz0aF4oEW7lj6VCex7p3MAp3XyGKXEFUSU1wiIhPQ3JG5Z/PGcCzTRaLuMrGSSwfATosIxonr97HrQioAIMjNHlfvZAMANr7YXedz9WquvQdR7492iff3XbojOWanp/VDPVDYxtICE3oFYkKvQACAXyM7DAv1hSAIkFvIoFQJcFBoX6NIqRK3JGALCxmLLSxERCag/uL+8qmO+H5CmFF7BL37cGvYW8vxWCdfbHihOz56vD32zeiH9k1cdNZ3sjUuOVhzIAGbjlzXKs8pGbTroGf8iUwmw3fPdQMAHL12X7KJIyAd9MsxLGQsJixERCagHsNiLS9/GrEuQe4OOPruAHw8ogM8nBR4sqsf/Brp3/FYJpPB2D0T39h8CpdTMiVl6gGzduV052gmM53e2yE9v6Q7yFpuIQ4yJjIU3zFERCYgJiyV/OJWWMkhtzA8C1k1tqvkcfzCh7TqlO06SsnIlzw2ZMCs5h5BZadR5xiQ8BDpw4SFiMgE1GNYaquloU8Ld/H+xyPaQyaT4cisCOyb0Q/P9QxEz+aN8cXojpJz/jx9G+/8chqr9scjp6CotIXFWn/C4dfIThzbAgC5GklLFmcIURXwXUNEZALqWUI2tZSwWFjIcOWDh1CkUonL/7s5FE+Tnv1Ia7Hee8PaYPavZwFI12R5749z8C6ZwqxvUK7arCGt8Oep20jKyMPxxPvoUdJyk8MZQlQFbGEhIrOj1Fh2vr4qHcNSe1/ecguZmKzoMyY8AD2aNdZ57HZ6HgDgTla+zuNqMpkMYUHFC9cd1JhqXTqlmX8rk/GYsBCRWbmSmoUO87bj0x0XTR1KjVInLFaWRo6GrQXqheYAIMTLUev4+aRMrbKywgKLk55DV0t3iFbPMmKXEFUGExYiMiv9P9mDrPwifB5zyeBzBKFyLTKCIIgDQWub5iwhcxPZxgsA0M7XGeufD8OLDwRJjocH6W6B0aRuYTkUfw+DP9sHpUrgonFUJUxziahO23MxFVN+OIYPHm2HRzr4GHXupO+PIfpsEva+0Q9NG+ufFmyIhDvZyMovQltfZ4Pq59fyoFtjvDogGAGN7TAmPADOdlaY+VAr9G3pgdzCIiTezcGQ9hX/nIPc7GFjaYH8IhXibmdg4ndH0L0kiWELC1UG3zVEZBYKilR45cfjRp/38vpjyMovwtQfj6O5hwNaeTsZdN6hq3cRXbLL8ZoDCZKBp8ZSqgT0XbwbAHDgrQfh42Jbbn1BEKo8rbkmNXG1w9T+wZKycD3jWvSRyWTi4ngAsPN8CjLzilfK5RgWqgzz+00hogZp6/GbYgJhKEEo7WYAgMGf7TP4XM3l6NNydO97Y6grqVni/R6LdmL86sMoKrNXkKYijUHFNrU46La2bZv+gLjTNAD8l3AfACT/Z0SGYsJCRGbhYPzdiiuVEV+yh05laLZspGSWP+ulInG3MySPd11IxbazyXrr7ynZB6hsHPVNSy9HXP7gIUzsHSgp/+X4TT1nEOlXf39TiKhOuXEvV6tsawVfbDfTtM+5fi/HoOfTnDq9//IdpFYhaUkv2RRQU+zVO2K3T1nPf3dEvF92c8P66J0h0u62tx8KMVEkVJcxYSEis6BrmfnpG0+Ue05SybogvYPdYF+y+uoz3x6S1Dl1Iw3rYhO0kgdVmZlFm45qb/ZnqAwdCcv3BxMx+9czFZ5raYazhGracz0DK65EVEbD+00hIrMkoDiBeKyjr8HnnL1V3BXj39gO3QKLZ6Bcu5uDhDvZEAQBxxLvY+iX/+LdX89i+kbpgN6yi9MlVKF76VJKls7yDf9VPgmqb6IGtAAA/DAxrEEmaVR1fNcQkVlQt4BEtvUyqP7llCysOZAAAGjfxAUv9WkmHjuccA9jVh3GY18dEMv+Op2E2+mlXUjKMi0s6uQHAFQqATO3nMJ7v58zKJbjiWkAihdZa6yx+R9Q+TVi6ptX+gfj/PxB6NHMreLKRDowYSEis5CvMc33rcHFYxx89UwPVqkE/Hbylvi4o58LwoIaY3BJsjNj8ynJLCC1jRotHqoyLSzX7paOfTl1Mx0/Hr6OVf/G49PtF8qN+92tZ5BYMm4makALHH13gLjeCABk5HFGjJrCqv7OiKKax4SFiExuXWyC2MJhY2mB9k2KF1/TtSvwwr/j0HbuNmw4nCjWCfYsXj5+aAULx32z9yoyStYCUc867teyeBfjrPwicTuA+xrTnFf9m4BdF1JwMVl7OfqUzDysO3hNfKzultrwQrgY+/1s/VOm3Rys9R4jIikmLERkUldTs/Buye7AQHHCot4NWL33TF6hEscT76NIqcKKPVeRU6AUpyK/PrCleO7gdt7lPld2gRKTvj8KADh+vXhNkMYlOxYDwOcxl/D+n+cw8+fTYllWfhHGr/4PA/+3F8kZeZLr3U6TPnaxK01AGpV0Dd0tk7DkFynF++uf715uvERUigkLEZnUuTJrmFjL5eKMH/XKqG9sPoVHvzqA5u/8rXV+E1dpt9H3E8IAAGGBjRBQsty+rZUcT4U1BQD8e/kuAt76Uxx3svnoDSwZGSqe/82+eCSVSUzUNpYZRJtbWJp8hAU2khzzcy1+7he+OyJJUtTrs7g52KC5h4PO5yEibUxYiMikLpeZYWNtaQEPRwWA4vEfv528hd81xquU1bGpq+Rxr2A3JCwago0vhiN6+gN4uV8z/PRiOMaE++u9xnADZyYl3JXOJMotKE1EPny8veTYo52Kr3k3uwBPf3MIGXmFEARB3H7Aw9FG51RuItKNCQsRmVRajnQNEydbSzjbWYmPde0vFOzhgMg2ntg3ox/cHW20jqsprOR4IzIE7Zo4Q2Gpe8Dn5pfCAQCPdfKFnbUcrUv2Ivp8dEesHt8V7Xyd8VrJlNwtx27iTlbpAnNTfjgm3g9ws5dcd2gHHwSXtKAcuXYfn26/iNgrpav5umi8RiKqWKUSlqVLlyIgIAAKhQJhYWE4fPiw3rrffPMNevfuDVdXV7i6uiIiIkKrviAImD17Nry9vWFra4uIiAhcumT41vJEVHdllplF4+1c3MXTO1j/9NeZD4VgxbNd4NfI8B2WG+kY4BrkZo8uAcVdOZ880QHH3h2Av6b1RsKiIRjawQf9Wnrg96m9MLqkOwkAXi1ZzC7+TjayS1pYQv1ctK6tsJJjR1Qf9GxevGngmgMJkoG7K57tbHDsRFSJhGXjxo2IiorCnDlzcOzYMXTo0AGRkZFISUnRWX/37t0YPXo0du3ahdjYWPj5+WHgwIG4ebN0ye2PPvoIn3/+OZYvX45Dhw7B3t4ekZGRyMvT3Y9MRPWHepzK2w+F4PL7g8Xyib2D9J7zYIin0c/jpLDCrCGtJGVuGq0zMplM77RbN42BufsuFS+5/+Hf58Wyb8Z00fu8ml1ec0vWdRnRuQkcFWxhITKG0QnLp59+iokTJ2L8+PFo3bo1li9fDjs7O6xatUpn/fXr12Py5MkIDQ1FSEgIVq5cCZVKhZiYGADFrStLlizBrFmzMGzYMLRv3x7fffcdbt26ha1bt1bpxRGR+VO3sHg6KSQroDoqLCX1vp8Qhm/GdMG59yIr/VzP9w5C3HuD0LGpC4Lc7bFmfFeDzz06K0K832LW35KdpcvrlnK21U5MfPSsL0NE+hmVsBQUFODo0aOIiCj9xbWwsEBERARiY2MNukZOTg4KCwvRqFFxM2x8fDySkpIk13R2dkZYWJjea+bn5yMjI0NyIyLTUqoExMQlIz230KjVXdXrojiVaXEo+0XfK9gNA1p7ilOeK8vWWo5fJvfEztf6GnWtRva610yZP6xNuefpSmbG9Qgw+HmJqJhRCcudO3egVCrh6SltjvX09ERSUpKes6TefPNN+Pj4iAmK+jxjrrlw4UI4OzuLNz8/P2NeBhHVgGW7L2PC2iN4YvkBdFnwD5b8c9Gg89QLxpVtUQlobK+rusnIZDJxPIqmUd2a6qhdamDr0q0GHu3oi9+m9NSb/BCRflX7U8VIixYtwoYNG7B7924oFIpKX2fmzJmIiooSH2dkZDBpITKxlfvjAQAXk4vHbCz55xKaNrLDY52a6D0np6B0wK13mW4SCwsZZgxqiY+iL2B6RHANRGy89c93x28nb0lmLllVsJHf02FNYWstR1hgI/ibWRJGVJcY1cLi5uYGuVyO5ORkSXlycjK8vMrfsGzx4sVYtGgRtm/fjvbtS9crUJ9nzDVtbGzg5OQkuRGRaen64o766WS552TkFicsMhng46z9R8xLDzTDX6/0xtQHzSNhAYqnK7cs2QqgQ8kWAuWxlFvgyS5+TFaIqsiohMXa2hqdO3cWB8wCEAfQhoeH6z3vo48+wvz58xEdHY0uXaSj6QMDA+Hl5SW5ZkZGBg4dOlTuNYnIvFjraWlIzy3UWQ6UzhBytrWCTKa9iJqFhQytfZzMboG1v6f1xrKnO+GrZzg1mai2GN0lFBUVhbFjx6JLly7o1q0blixZguzsbIwfPx4AMGbMGPj6+mLhwoUAgA8//BCzZ8/GDz/8gICAAHFcioODAxwcHCCTyTB9+nQsWLAAwcHBCAwMxLvvvgsfHx8MHz68+l4pEdUoa0vdCcvIFbFo7e2EDx5rpzVt+ODV4oXU7Ks4kLa2WVjIKty3iIiql9GfEiNHjkRqaipmz56NpKQkhIaGIjo6Whw0m5iYCAuL0g+uZcuWoaCgACNGjJBcZ86cOZg7dy4AYMaMGcjOzsYLL7yAtLQ09OrVC9HR0VUa50JEtctKrrsV5HxSJs4nZaJHczeM6Cwdz6Le9PBmWm6Nx0dEdZtMMGb+oZnKyMiAs7Mz0tPTOZ6FyAQKlSoE69iYUNPcR1pjTHgALEq6d7YcuyEZ45KwaEiNxkhE5seY72/uJUREVbb+4LUK68z9/RzGri7eliO3QFnhgFwiIk1MWIioyo5cu29QvX2X7gAAlu66LCkvu2Q+EVFZTFiIqMrKmwmkyz9x0mUMngorf/E1IqK6NTSfiMySrZ5NA/XJL1KJ9y+/P1iyhxARkS78lCCiKuvRTHvJen3rsvxy/Abalyy41s7XmckKERmELSxEVGVFKu3Jhm4O1riVnqdV/urG0sG2j3fyrdG4iKj+4J82RFRl6i4ezRVpNReJG98zQOd5VnoWmyMiKoufFkRUZepNDJ1trcSy5h4O4v23H2qF+cPb1npcRFR/sEuIiKqkSKnC/ZzSPYHuZRcAAJq42uGnF8PhbGsFK7kFnu3uj0c7+qLtnG3iudfvcYVbIjIMW1iIqNJOXE9Du7nb8cOhRADS3YvlFkC3wEZo6eUoljnYWOLdh1uLjzVbYYiIysMWFiKqtA/+ikNuoVJ83C2wMbaeuAUAkFvo/nvouZ4BeDDEA4eu3sWwUJ9aiZOI6j4mLEQkkZVfhPGrD8PP1Q6fjgwtv3KZyUF21qUDbfXNVpbJZAh0s0egm33VAiWiBoVdQkQk8fza//Bfwn1sOX4TxxPLX3I/X6mSPLbRmPUjl+nevZmIqDKYsBCRxMGr98T7Px25UW7dgiJpwuLprBDv6+sSIiKqDH6iEJFeyRnaC79pSsspkDwObFzazZNTWFQjMRFRw8SEhYgk7DXGoVjJy+/WUU9hVrOzKT03NTO/egMjogaNg26JCEDxjJ8DV+4gu6B01o+LrXW554R4O+Hk9TTxsaVGN1Azd05ZJqLqw4SFiHD9Xg6+3ntVq/xOVvmtJPkaU5oBwEIG/DG1F7afS8ZzPQOrNUYiatiYsBAR+n+yR2d5zPkUZOYVwlFhpfP4+aRMyWOZTIa2vs5o6+ussz4RUWVxDAsRoaDM9GRNH/wVp7M8I69Q8rhPC/dqjYmISBMTFiIq14+Hr+ss15zSfGZeJL4Z06W2QiKiBogJC1ED9e/lOziWeB/nkzJ0Hu8d7Cbe1xxYu3TXZSzddRmFJa0yVnIZHGwsYW3JjxMiqjkcw0LUAN3PLsDTKw9plX/waDus3H8V/UM8MKVfMDq8tx0AMGzpv7j6wUNY8GccVv0bDwDIL1InLExUiKjmMWEhaoCy8nUv6ublbIOdr/XVeezAlbtisgIAn8dcAgBYWnAJfiKqefzTiKgB0rfNT3nL6T/zrXaLDADkFekfsEtEVF2YsBA1QEVKQWd52daSNeO7Vnwx3ZciIqpWTFiIGqAile4sw6bMwNm+LT1wYcGgcq/lbKd7jRYiourEhIWoASpS6e7G8XBUaJXZWMrRPaiR3mstGN622uIiItKHCQtRA6SvS8jDyUZn+byhbdHZ3xVPhzXFqK5+YvlPL4Yjso1XjcRIRKSJs4SIGiClni4hhZVcZ3lLL0f8PKkHAGDb2SRs+K94MbnO/q41EyARURlMWIgaIH1dQoZ4INgdfo1sEeTmADmnNBNRLWHCQtQA6esSMoSttRy7X+8H5ipEVJuYsBA1QPpmCRmKLStEVNs46JaoAdKVsDja8O8XIjJfTFiIGqAipY4xLGw0ISIzxoSFqAHS1cLy1dOdTBAJEZFhmLAQNUBlpzXPfaQ1ege7mygaIqKKMWEhaoAKy3QJOSi4vD4RmbdKJSxLly5FQEAAFAoFwsLCcPjwYb11z549i8cffxwBAQGQyWRYsmSJVp25c+dCJpNJbiEhIZUJjYgMULaFxVbPgnFERObC6IRl48aNiIqKwpw5c3Ds2DF06NABkZGRSElJ0Vk/JycHQUFBWLRoEby89C/h3aZNG9y+fVu87d+/39jQiMhAZddhcVBwhhARmTejE5ZPP/0UEydOxPjx49G6dWssX74cdnZ2WLVqlc76Xbt2xccff4xRo0bBxkb3PiUAYGlpCS8vL/Hm5uamt25+fj4yMjIkNyIyXNlBt+18nU0UCRGRYYxKWAoKCnD06FFERESUXsDCAhEREYiNja1SIJcuXYKPjw+CgoLw9NNPIzExUW/dhQsXwtnZWbz5+fnprUtE2jSX5m/n64xG9tYmjIaIqGJGJSx37tyBUqmEp6enpNzT0xNJSUmVDiIsLAxr1qxBdHQ0li1bhvj4ePTu3RuZmZk668+cORPp6eni7fr165V+bqKGSN0l1K+lO7ZM7mHiaIiIKmYWHdeDBw8W77dv3x5hYWHw9/fHTz/9hAkTJmjVt7GxKbd7iYjKpx5062pnDSs5JwsSkfkz6pPKzc0NcrkcycnJkvLk5ORyB9Qay8XFBS1atMDly5er7ZpEVKqwpEuIewIRUV1hVMJibW2Nzp07IyYmRixTqVSIiYlBeHh4tQWVlZWFK1euwNvbu9quSUSl8gqUAAAbK7auEFHdYHSXUFRUFMaOHYsuXbqgW7duWLJkCbKzszF+/HgAwJgxY+Dr64uFCxcCKB6oe+7cOfH+zZs3ceLECTg4OKB58+YAgNdffx2PPPII/P39cevWLcyZMwdyuRyjR4+urtdJRBru5xQCABrZcbAtEdUNRicsI0eORGpqKmbPno2kpCSEhoYiOjpaHIibmJgIC4vSv9pu3bqFjh07io8XL16MxYsXo0+fPti9ezcA4MaNGxg9ejTu3r0Ld3d39OrVCwcPHoS7O5cKJ6oJ93IKAAAuTFiIqI6QCYKgvQtaHZORkQFnZ2ekp6fDycnJ1OEQmb2nVx7Ev5fvYsnIUAzv6GvqcIiogTLm+5sd2EQN0L3s4i4hFzvuIUREdQMTFqIGRqkSEHe7eHVoLhhHRHUFExaiBuZicumCjA42ZrEUExFRhZiwEDUwlhprrzRtZGfCSIiIDMeEhaiBuZmWK9635Cq3RFRH8NOKqIF5e8tpU4dARGQ0JixEZqamVxq4lZ5Xo9cnIqoJTFiIzMjvJ2+h6/sxOJJwz9ShEBGZFSYsRGZk6o/HcScrHxO/O1Jjz9HWt3hxpiB3+xp7DiKi6saEhcgMFalqrlsop2TjwwXD2tbYcxARVTcmLEQNTLp640MHLhpHRHUHExYiMyTTuH/tbraYZFSHAqUKAGDFKc1EVIfwE4vIjF2/l4M+H+9Gr492Vts1lSXdTVYW/PUnorqDn1hEZkgmK25jORRfPFsoM68If5y6VS3XLlIWJyyWclkFNYmIzAcTFiITEgRBbPHQVJKv4Epqllg25Yfj1fKc6i4hJixEVJcwYSEyEUEQMOrrg2g/dxt2nk9GYUkiAQBpJWNWqntzwksaGx+yS4iI6hJu1UpkItkFSrHL57k1R2BvLZccFwQB+UUqrTJ1d1FlqJ8PAORsYSGiOoR/YhFVUW6BEgVlEgtDlD0nu2R9FLX8IhXyi6RlmflFAIAVe65g4d9xRj+ns62VeN+xmltviIhqEhMWoirIKShC+3nbELlkr9HnanYB6ZJXqER+obTO/ewCnLiehoV/n8eKPVeRnGHcvkDq8TI9mzeuUksNEVFtY8JCVAUnr6ejUCkg/k620edW1CqTV6hCXqG0heVedgFe+bF08G2akeuzqJMkS45fIaI6hp9aRFWg2Uqia7ZPecqOTwGA9x8tXS4/r1CplbAcS0xD4r0c8XHkkr0YsewABny6B1kl3UXlxZqSmQ8AsOL4FSKqY5iwEFWBZsJSURdPWeoWFksLGV7u1wz/RPXB02H+4vG/ztxGXpkuofl/nNO6zpFr93EpJQu/HLtR7vO9/2ccPt52oeQ5+atPRHULP7WIqqBQWdqqoqvFRB9BEHDmZjoAwNNJgTciQ9Dcw0FS56PoC8grM+i2PO/+ehZpOQVa5X+fvo0XvjuCNQcSxDKFFX/1iahu4TQBoirQnMVjzEyhvZfuYMbPpwAANpb6k4ek9OJBtVEDWuDTHRcrvO6H0efxT1wKBAE4/HZ/ZOQVYtL6Y1r1Wng5GhwrEZE54J9ZRFWQozEVucCILqGxqw6L91WCdOzL/GFtxPvnk4oXevNvbIenwppWeN0fD19HamY+7mTl4/dTt7D+UKLOeoGN7Q2OlYjIHDBhIaqCbI2BroWVWIsFABLu5kgePxseACeFtPHz3O0MPNcz0KjrTttwQhyz0relO1aP6yoea+vrXKlYiYhMhQkLURVk55e2sGTmlT9LR+3G/ZwK62SUuVb3oMZo7uGAgzP7I0RHd85XT3cq93ov9A5CvxAPxLzWBz9PCodfIzuDYiUiMhdMWIiqIKegNLF45Mv9CHjrT9xMy8XCv+Kw6ch1rfoJd7Jx9laG0c/To1ljAICXswLR0x9ARCtP8dj5+YPQytup3PPbNiluUWnm7oDO/o2Mfn4iIlPjoFuiKtC19smg/+0Vl9Bv5uGATk1dAQCH4+/hyRWxYj2FlQWs5BaYEdmywuexlkv/triTla9xHTkC3aRjUtwdbZBasubKjlcfgJPCCkREdRlbWIiqIKdAe9pxpkYS89hXB3AnKx9Z+UWSZAUAnusZiJOzB+LZ8ACta7z7cGvJ47LL6KdUsCS/o8YYmLLTpYmI6iImLERVUNHqsgDQZcE/aDtnm1b5xN5BsLDQveKsfwVjTGYMCgEAjOsRIJaN6NxEvK+wLN35mXsGEVF9wC4hoirQHMNijJaejnC1t9Z7vKJBscM7+qKzvyt8XWzFskWPtYOnkw16NHMDADy98hCe7e6v7xJERHUKExaiKsjKN3wlWgBY/EQH9A52g8JKXm69Fp4Vd+OUTWos5RZ4IzJEfLxvRj94OSuMio+IyFyxS4ioCnI0uoR6B7vB3rr8RMTF1gqeTgo425Y/CFYmk+HigsEY0s4bCx9rV6nY/BrZwUrOX3Eiqh/4aUZUBeqF4ywtZPh4RAdk6xiEq6l9E8MXbLO2tMDSpzthdLeKV7glIqrvmLAQVYE6QYme/gC8nBXo08IdANA1wFWr7nM9A+HhxC4aIqLK4BgWokoSBEFsYXGwKf5V+uTJDvjhUCIebu+NXRdSMf+Pc/htSk/kFap0JjFERGSYSrWwLF26FAEBAVAoFAgLC8Phw4f11j179iwef/xxBAQEQCaTYcmSJVW+JpE5SMspRJGqeONC9bonbg42eKV/MILcHTChVyASFg1B+yYu6BbYiNOLiYiqwOiEZePGjYiKisKcOXNw7NgxdOjQAZGRkUhJSdFZPycnB0FBQVi0aBG8vLyq5ZpE5uC72GsAipMUexs2VhIR1SSZIJTZ274CYWFh6Nq1K7788ksAgEqlgp+fH6ZOnYq33nqr3HMDAgIwffp0TJ8+vdquCQAZGRlwdnZGeno6nJzK31OFqLoEvPWneD9h0RATRkJEVDcZ8/1tVAtLQUEBjh49ioiIiNILWFggIiICsbGx5ZxZvdfMz89HRkaG5EZERET1l1EJy507d6BUKuHp6Skp9/T0RFJSUqUCqMw1Fy5cCGdnZ/Hm5+dXqecmqg6PdfQ1dQhERPVenZzWPHPmTKSnp4u369evmzokaoDa+RavqfJwB28TR0JEVP8ZNVLQzc0NcrkcycnJkvLk5GS9A2pr4po2NjawsbGp1PMRVZe03AIAqHDVWiIiqjqjWlisra3RuXNnxMTEiGUqlQoxMTEIDw+vVAA1cU2impaVX4Tk9HwAgLsDF4MjIqppRs/FjIqKwtixY9GlSxd069YNS5YsQXZ2NsaPHw8AGDNmDHx9fbFw4UIAxYNqz507J96/efMmTpw4AQcHBzRv3tygaxKZm13nU1CgVCGgsR38GtlWfAIREVWJ0QnLyJEjkZqaitmzZyMpKQmhoaGIjo4WB80mJibCwqK04ebWrVvo2LGj+Hjx4sVYvHgx+vTpg927dxt0TSJzc/pmOgCgk78rF4QjIqoFRq/DYo64DgvVNvUaLLZWcsTNH2TiaIiI6qYaW4eFiKRyC8vfnZmIiKoHExYiI11IyhTvW1vyV4iIqDbw05bISBeTSxOWv17pZcJIiIgaDiYsREa6lJIFAIhs44nmHo4mjoaIqGFgwkJkpIQ72QCANj7OJo6EiKjhYMJCVEZ+kRLnkzKgOYHuSmoWsvOLcCEpE7+dvAUA6B7U2FQhEhE1OEavw0JU3728/hj+iUtBkJs9ng33Rxf/Rnjky/0IcrdHkJuDWK+Lv6sJoyQialjYwkJUxj9xKQCAq3eyMe/3c/jz9O3ix6nZKFCqAAARrTxgYcEF44iIagsTFqIKaE5d3nsxFQAwLNTXVOEQETVITFiIKpCRW6hVFtDY3gSREBE1XExYiCqw5kCCVpm/m13tB0JE1IBx0C0RAJVKwMYj19HWwKnKjjb81SEiqk381CUC8PupW5i55bTB9blDMxFR7WKXEDVYBUUqFJbM+lm2+0q5dWNe61MbIRERkR5MWKhBKlKq0H1hDHos2gmVSsB5jQ0NdWnm7lDucSIiqlnsEqIG6U5WAe5lFwAAMvOLtI5byWUoVApa5QDwTPemNRobERFpYwsLNUgWGu/8opJuIU1vDgrBAy3cAQBPhxUnKB882g5DO/jgxQea1UqMRERUii0s1CBZaAyavVqymaGmQDd7PN6pCXacS8awjj4AgKfCmuKpMLauEBGZAhMWapBUGhsbvvf7Oa3jbg42cLW3xpNd/WozLCIi0oNdQtQgaeQrOH0zXet4+yaGrcdCRES1gwkLNUhKle4BtWpcZ4WIyLwwYaEGSbNLSO2H58PQsakLfpzY3QQRERFReTiGhRokHfkKwoIa45fJPWs/GCIiqhBbWKhBKtslZG8th9yC3UBEROaKCQs1SGW7hDhmhYjIvDFhoQapbMKSpWO1WyIiMh9MWKhBqmCSEBERmRkmLNQglR3D4mxrZaJIiIjIEJwlRA2SZsIypL03RnFFWyIis8aEhRqk/KLiDQ/9Gtli6VOdTBwNERFVhF1C1CDlFSoBALZWchNHQkREhmDCQg1SbgETFiKiuoQJCzVIueoWFmsmLEREdQETFmqQctklRERUpzBhoQYpjy0sRER1ChMWqhNup+eKSUZ1UI9hUbCFhYioTmDCQmbvUnImwhfuxKNfHai2a6q7hOzYwkJEVCcwYSGz98ep2wCAuNsZ1XI9QRCw5J9LADiGhYiorqhUwrJ06VIEBARAoVAgLCwMhw8fLrf+pk2bEBISAoVCgXbt2uGvv/6SHB83bhxkMpnkNmjQoMqERvWQ5kbKglD1TYCu3c0R71vKmbMTEdUFRn9ab9y4EVFRUZgzZw6OHTuGDh06IDIyEikpKTrrHzhwAKNHj8aECRNw/PhxDB8+HMOHD8eZM2ck9QYNGoTbt2+Ltx9//LFyr4jqHQuNjGXub2erfD3NBCi/UFXl6xERUc0zOmH59NNPMXHiRIwfPx6tW7fG8uXLYWdnh1WrVums/9lnn2HQoEF444030KpVK8yfPx+dOnXCl19+KalnY2MDLy8v8ebq6lq5V0T1yp+nbuObvVfFx2tjr1X5mpqNNHlF1TeQl4iIao5RCUtBQQGOHj2KiIiI0gtYWCAiIgKxsbE6z4mNjZXUB4DIyEit+rt374aHhwdatmyJSZMm4e7du3rjyM/PR0ZGhuRG9Y8gCHj5h2PIzC+SlF9IyqzSdYtUpa0qno6KKl2LiIhqh1EJy507d6BUKuHp6Skp9/T0RFJSks5zkpKSKqw/aNAgfPfdd4iJicGHH36IPXv2YPDgwVAqdf/1u3DhQjg7O4s3Pz/utFsfpWTm6yyPXLK3StctVJY2sTzTvWmVrkVERLXDLHZrHjVqlHi/Xbt2aN++PZo1a4bdu3ejf//+WvVnzpyJqKgo8XFGRgaTlnroSMJ9vcey84tgb1O5t69SVZyweDkp0NjBplLXICKi2mVUC4ubmxvkcjmSk5Ml5cnJyfDy8tJ5jpeXl1H1ASAoKAhubm64fPmyzuM2NjZwcnKS3Kj+OXUzTe+x6/dz8OuJmyhUGj9oVn2OpVxWQU0iIjIXRiUs1tbW6Ny5M2JiYsQylUqFmJgYhIeH6zwnPDxcUh8AduzYobc+ANy4cQN3796Ft7e3MeFRPaJUCVix56qkbNFj7cT7g5bsw7QNJ7DpyA2x7Mb9HCzfcwUZeYXlXlu9aJy1Jac0ExHVFUZ/YkdFReGbb77B2rVrERcXh0mTJiE7Oxvjx48HAIwZMwYzZ84U60+bNg3R0dH45JNPcP78ecydOxdHjhzBlClTAABZWVl44403cPDgQSQkJCAmJgbDhg1D8+bNERkZWU0vk8xFReuopGTm4ZEv9muNU5k3tA2e7OKntdDbvkup4v3R3xzEor/PY/7v58p9jpv3cwEAvi62xoROREQmZPQggJEjRyI1NRWzZ89GUlISQkNDER0dLQ6sTUxMhIVFaR7Uo0cP/PDDD5g1axbefvttBAcHY+vWrWjbti0AQC6X49SpU1i7di3S0tLg4+ODgQMHYv78+bCx4fiC+iQ5Iw/Dl/6LJzo3QdTAljrrfLP3Kk7fTJeU9WnhjrE9AgAUt4rkauwptP/SHfH+9XvFiUjMed1rAqndKElYmrgyYSEiqisqNWpxypQpYgtJWbt379Yqe+KJJ/DEE0/orG9ra4tt27ZVJgwygiAIOHE9Da28nUy24d+I5QdwOz0Pn++8rDdh0dVN89XTncT7AW72OHk9TXzs6Vw8LTk9p7QbqKJWnNvpxQmLjzMTFiKiuoKd+A3Et/vj8ehXBxDybjTGrz6Mu1m6pwzXJHULiKbMvEIcS7wvJhleZZKILZN7SGYDvTe0DTr4uYiPL6dkIe52Bt7eelosu59T/hiW7PziFhonWyujXwMREZkGE5YGQnNw6q4LqZi+8QQA4KPo81h7IKFGn/v6vRwEvPWnpOxmWnHyMn71f3jsqwOIPlO8Lk9egXTtnRAvR8njDn4u+PXlnjj8Tul098Gf7cOfJRskAoDCygIqlf5WFvWgXFvu1ExEVGcwYWkgejRvLHm879IdnE/KwFe7r2BONezPU54vdl7SKuu5aCcuJGXiyLXitVYmrT8GAMgrGZ/SwtMBFxcMhp217l5Lj3JWqM0rVGH2b2d0Hpv3+1nsKxn3Yq/n2kREZH6YsDQAKpWAzRotLADg18gWWXmlS97HxCVDpRLwx6lb4hiP6vJTmedWKzsT6GZarri3T49mblWadvz9wUStsrtZ+Vj9b4L42I4tLEREdQYTlhp0MTkTn+64iMwK1gWpaX+cvi3uxzOtfzAAoEgpQLPTZMLaI1j1bzym/HAc41f/Z4Ioi1tdjiemAUCNDAyOPltm+wiuG0dEVGcwYalBA/+3F5/HXJLsNlzbktLz8MqPx8XHvYLdissz8pCRK02kFvwZBwA4X87mgqv2x+PBxbuRVWZDwvJYy0vfZhWtfXLgSvGml2XXW9FlYOvSPaoCGtvh+LsD8MfUXgAAmQxaq+Bm5kljLjs+hoiIzBcTlhryXWyCeD/hbo7J4nh82QHJ4/ZNnAEAggD8E5es65RyvffHOVy9k412cw2fiu7hVLqezl+v9MbSpzpJjkdP7611jsKq4rfm4ic74KPH2+Pk7IHY/UY/uNpbo7W3E+QWMggCcDerAEDpNOfCouIEZmBrT/wT1QfenNZMRFRnMGGpIbN/LR3IGuhmb5IYCopU4mwcNRvL0paLHw9f13uu+kv+0NW7CJr5J0Z9HYuzt9I1jhseh4WsuO9lzfiucLazwpD23mLXlMLKAgGNtX8+hnQJOSms8GRXPzjblU5PtrCQwVFRPJg2K78Qp2+kI/idv/H6ppMoLJk55OmkQHMPB8NfABERmRynSdSAsguXqb+wdTlw+Q7u5xRiSPvq3zcpLadA8njN+K4AirtPKmr1WfBnHNr4OCHqp5MAgINX72HI5/srFUdOyVRlT6fSmT2T+jZDoJs9ugS4QmElx8+TekhagwzpEtJH3QWVX6TCR9vOo0glYPPR0oG/VnLm6UREdQ0/uWvAtTLJQH6RUmc9QRDw1MpDePmHY7hxv/q7jTI0xmzEL3wIfVt6AADeHBQiqdenhTucyyyi9u3+eDFZ0cfQwcQ5BcVxaE4jVljJMbyjL5q42gEAOvu74pnuTcXjvVu4GXRtXdSziwqKVFqvCwDOJ2VU+tpERGQaTFhqwNjVhyWP9e0enK2xSFp6bvXPJFInFL4utpBptPIMbueNFc92Fh/fzc7HyTkDEb/wIcwa0srg66dkVrxa7oI/zoktLBUt1LZgeDvEL3wICYuGVGl8iWbCEuSu3fXTLbBRpa9NRESmwYSlBpRtYbmTWaBVJ79IiWe/PSQp+/FwIv45Z/xAWH3Us2LUYzo0RbbxEu87lCx9L5PJtLqmnusZiJmDpS0yamW7nMq6fi8HK/fHi4/tbSru5pGV031mKPU4nfwilc7WrRcfaFbl5yAiotrFhKUWaK3/geIl6dVrjgDAkM/3Y+aW03j+uyPlLitvjHvZxQmFi135e+a4a6wa66QorTuwtSfeiGyJUI29ezQHEL+47iiSM/L0XrfsMYVl7SzU5lSSoKXnFiK/UDq1uYu/K5fkJyKqg5iw1IA2Pk5aZWVbI/R1EwHArydvGv2cgiBoDfa9nV6cMOjblfi1AS3g7miDNweV7pxsb2OJ+cPa4L1hbfD1mC6wtZYjtKkLQv1c0DvYDTFRfcRWmDtZBXhx3VG9MSXek7Y0WVjUzkptrnbWAID7OQVaP2dT7VRNRERVw4SlBqgTltHd/MSy/KLyFzHT9OrGk1qLnlVk7m9n0X7udlzXSBLibhcPLvVy1r3vztT+wTj8dn9x4Kvas+EBGBMeID62sZRj68s9sW5CWPG0YY3dk09cT0PAW39ixmbtAbqmWn/G1b64lWj2r2ex5Zg0+eN0ZiKiuonTmmtAQUlyEuRW+uV4JOG+ZHxI2XEuZd3NKtCbaJR1OSULa2OvAQDGrT4MZ1srHNPobvIu5zqVGTPSL8QDG/6TruHy05Eb8HO1w9SS9VUA4NrdbKOvXR10bWoY0coTrnZWiBrYwgQRERFRVbGFpQYUKou7ZjQ379PcEbmgqOLWk1QdM3DuZuVrdftcSc1CxKd7NB5nS5IVAJBbVO9/c3izxjrLY6/elTxWJ2UTegXiyKyIao2hPBeStbcWGNzWCx8/0UEyRoeIiOoOJiw1QN39o5mw3MnKR8i7f2Ph33F4fZP+9U2CS7osbpXZMXnvxVR0XvCPZAVdAHjhuyMVxqNeB6W6OCmssPO1Plj+TGdJuebrVakEXCxJHEZ19YObgw1qS9nnCnKzx4A2nnpqExFRXcAuoRpQUDL+xFpugV7N3bD/8h0AQF6hCiv2SDdCHBbqg5f6NMO5Wxnwclbgh8OJuJSShev3cqBSCbCwkOHnozfwWkmSs+7gNbzYJwgWMhl6LNppUDy5BboXrquKIHcHBLk74PcpvXD2Vjre2nIauy+kIj2nEM52VohLykBOgRJWclmtb03Q2tsJvxwvHruy941+8HZRcHVbIqI6jglLDSgoWfvD2tICIzo3ERMWXT4b1REA0Mq7eKDuvyV1fz52Ewv+jMMr/YPxecwlyTm/HLuJ49fTJGVXP3gIh+LvYfQ3B7Weo1+IR6VfS0XaNXGGv5sd3tpyGgDQ4b3tODsvEgcuF3cPeTvbwrKWk4WxPQJwOz0P/ULc0bSxXcUnEBGR2WPCUgPUY1Ss5BZ4pIMXOjZ1wS/Hb8JRYQW5DDgUfw9/n0mCr4v2dGP1AFn1DJ+yyQoAfLLjouRx1IAWsLCQIbxZYzT3cMDllCy08XHChhe6Izkjv8ZnxpQdF9JmTulOzpEm6IqxtrTA7Eda1/rzEhFRzWHCUgPUg25tSsZ0+De2x/SI0tkpI7r4IdjDAY93bqJ1rq2OGS5qTRvZaa1tAgBTH2wu3l8wvC1++u86Xo9sCUeFFRxraZBp/MKHEDjzL63yQW2rf1NHIiJqeNixXwMKdAy61eRgY4mogS3h31h7bIe+5e7lFjLsndEPw0J9JOVTH2wumZrcPagxPh0ZCh8drTc1SSaT4fi7A7TKW3hy3RMiIqo6Jiw1QBx0qydhKY/mMviaugcVb9j32aiOWDmmi1jeO9jd+ABriKu9Ncb1CBAffzOmS6218BARUf3GLqEaILawVGKwaWd/V/wyuQcCGttj76VUTNtwAgAwrkegWCeitScGt/XCudsZaN/EuVpiri5vP9QKz/cO1Fo9l4iIqCqYsNQAXeuwGEomk6FjU1cAwLBQX7T1dcbRa/cR0Uo602fZM53Fac/mxNrSgskKERFVOyYsNUA9rbk61v5o5u6AZu66x4GYW7JCRERUUziGpQaUnSVEREREVcNv1BpQlUG3REREpI3fqNVMqRKgVJVsfsjl4ImIiKoFv1GrmeZOzGxhISIiqh78Rq1mmgkLN9wjIiKqHvxGrWbq8SsAYCXnLB4iIqLqwISlmmkOuNVcMp+IiIgqjwlLNVN3CdmwO4iIiKja8Fu1mlW08SEREREZj9+q1UipEnAnKx8AExYiIqLqVKlv1aVLlyIgIAAKhQJhYWE4fPhwufU3bdqEkJAQKBQKtGvXDn/99ZfkuCAImD17Nry9vWFra4uIiAhcunSpMqGZ1EfR5/H0ykMAOEOIiIioOhn9rbpx40ZERUVhzpw5OHbsGDp06IDIyEikpKTorH/gwAGMHj0aEyZMwPHjxzF8+HAMHz4cZ86cEet89NFH+Pzzz7F8+XIcOnQI9vb2iIyMRF5eXuVfWS1LyczDir1XxceJ93JMGA0REVH9IhMEQTDmhLCwMHTt2hVffvklAEClUsHPzw9Tp07FW2+9pVV/5MiRyM7Oxh9//CGWde/eHaGhoVi+fDkEQYCPjw9ee+01vP766wCA9PR0eHp6Ys2aNRg1alSFMWVkZMDZ2Rnp6elwcnIy5uVUSKUSUKBUQWEl11tnXWwC3v31rFZ5wqIh1RoLERFRfWLM97dRLSwFBQU4evQoIiIiSi9gYYGIiAjExsbqPCc2NlZSHwAiIyPF+vHx8UhKSpLUcXZ2RlhYmN5r5ufnIyMjQ3KrCQVFKkT9dAJTfjiGIo31VcrSlawQERFR9TEqYblz5w6USiU8PT0l5Z6enkhKStJ5TlJSUrn11f8ac82FCxfC2dlZvPn5+RnzMgx2KSUTf59Jwj9xKWj+zt+4nJKlVUel0t1AZWnBNViIiIiqS50cGTpz5kykp6eLt+vXr9fI87Txccb84W3Fx5FL9oobG6pdSdVOYtwdbfDN2C41EhMREVFDZFTC4ubmBrlcjuTkZEl5cnIyvLy8dJ7j5eVVbn31v8Zc08bGBk5OTpJbTRke6iveV6oEdJq/Q3I8I69Q8viNyJb4750I9GvpUWMxERERNTRGJSzW1tbo3LkzYmJixDKVSoWYmBiEh4frPCc8PFxSHwB27Ngh1g8MDISXl5ekTkZGBg4dOqT3mrXJ2tICP71YGkd6biFmbjmN+9kFAICcAqWk/uS+zWo1PiIioobA6C6hqKgofPPNN1i7di3i4uIwadIkZGdnY/z48QCAMWPGYObMmWL9adOmITo6Gp988gnOnz+PuXPn4siRI5gyZQoAQCaTYfr06ViwYAF+++03nD59GmPGjIGPjw+GDx9ePa+yiroFNsIvk3uIj388nIjpG08AALLyisTyj0a05/5BRERENcDS2BNGjhyJ1NRUzJ49G0lJSQgNDUV0dLQ4aDYxMREWFqV5UI8ePfDDDz9g1qxZePvttxEcHIytW7eibdvSsSEzZsxAdnY2XnjhBaSlpaFXr16Ijo6GQqGohpdYPTo2dcVzPQOx6t94AMCei6m4mJyJrPzShGVEpyamCo+IiKheM3odFnNUk+uwaPr+4DXM2lq64N1jnXxx7Np9JNzNwZB23lj6dKcae24iIqL6psbWYWnoItt4QWFV+iPbcuwmEu4Wr2hrZ61/YTkiIiKqGiYsRnB3tMHO1/pizxt94WxrJTnm5Ww+3VdERET1jdFjWBo6HxdbAICDjSXSc0unNE/i7CAiIqIawxaWSrqZlive/2FiGOysmfsRERHVFCYs1SDYw9HUIRAREdVrTFiqgbujjalDICIiqteYsFTS/jf74ZEOPtj4QndTh0JERFTvceBFJTVxtcMXozuaOgwiIqIGgS0sREREZPaYsBAREZHZY8JCREREZo8JCxEREZk9JixERERk9piwEBERkdljwkJERERmjwkLERERmT0mLERERGT2mLAQERGR2WPCQkRERGaPCQsRERGZPSYsREREZPbqxW7NgiAAADIyMkwcCRERERlK/b2t/h4vT71IWDIzMwEAfn5+Jo6EiIiIjJWZmQlnZ+dy68gEQ9IaM6dSqXDr1i04OjpCJpNV67UzMjLg5+eH69evw8nJqVqvXdPqcuxA3Y6/LscO1O3463LsQN2Ovy7HDtTt+Otq7IIgIDMzEz4+PrCwKH+USr1oYbGwsECTJk1q9DmcnJzq1JtAU12OHajb8dfl2IG6HX9djh2o2/HX5diBuh1/XYy9opYVNQ66JSIiIrPHhIWIiIjMHhOWCtjY2GDOnDmwsbExdShGq8uxA3U7/rocO1C346/LsQN1O/66HDtQt+Ovy7Ebql4MuiUiIqL6jS0sREREZPaYsBAREZHZY8JCREREZo8JCxEREZk9JixERERk9up9wrJw4UJ07doVjo6O8PDwwPDhw3HhwgVJnby8PLz88sto3LgxHBwc8PjjjyM5OVlS55VXXkHnzp1hY2OD0NBQree5cOEC+vXrB09PTygUCgQFBWHWrFkoLCysE/Frunz5MhwdHeHi4lInYk9ISIBMJtO6HTx40OxjB4qXpl68eDFatGgBGxsb+Pr64v3336907LUZ/9y5c3X+7O3t7c0+dgDYtm0bunfvDkdHR7i7u+Pxxx9HQkJCpWOv7fh/+uknhIaGws7ODv7+/vj4449NHvvJkycxevRo+Pn5wdbWFq1atcJnn32m9Vy7d+9Gp06dYGNjg+bNm2PNmjVVir024799+zaeeuoptGjRAhYWFpg+fXqVY6/N+Lds2YIBAwbA3d0dTk5OCA8Px7Zt26rlNdSkep+w7NmzBy+//DIOHjyIHTt2oLCwEAMHDkR2drZY59VXX8Xvv/+OTZs2Yc+ePbh16xYee+wxrWs999xzGDlypM7nsbKywpgxY7B9+3ZcuHABS5YswTfffIM5c+bUifjVCgsLMXr0aPTu3btKcZsi9n/++Qe3b98Wb507d64TsU+bNg0rV67E4sWLcf78efz222/o1q1bpWOvzfhff/11yc/89u3baN26NZ544gmzjz0+Ph7Dhg3Dgw8+iBMnTmDbtm24c+eOzuuYY/x///03nn76abz00ks4c+YMvvrqK/zvf//Dl19+adLYjx49Cg8PD3z//fc4e/Ys3nnnHcycOVMSV3x8PIYMGYJ+/frhxIkTmD59Op5//vkqf2nWVvz5+flwd3fHrFmz0KFDhyrFbIr49+7diwEDBuCvv/7C0aNH0a9fPzzyyCM4fvx4tb2WGiE0MCkpKQIAYc+ePYIgCEJaWppgZWUlbNq0SawTFxcnABBiY2O1zp8zZ47QoUMHg57r1VdfFXr16lUtcavVdPwzZswQnnnmGWH16tWCs7NznYg9Pj5eACAcP368WuPVVFOxnzt3TrC0tBTOnz9fY7ELQu2970+cOCEAEPbu3Wv2sW/atEmwtLQUlEqlWPbbb78JMplMKCgoMPv4R48eLYwYMUJS9vnnnwtNmjQRVCqVWcSuNnnyZKFfv37i4xkzZght2rSR1Bk5cqQQGRlZLXHXdPya+vTpI0ybNq1a41arjfjVWrduLcybN696Aq8h9b6Fpaz09HQAQKNGjQAUZ6OFhYWIiIgQ64SEhKBp06aIjY2t9PNcvnwZ0dHR6NOnT9UCLqMm49+5cyc2bdqEpUuXVl/AGmr6Zz906FB4eHigV69e+O2336on6BI1Ffvvv/+OoKAg/PHHHwgMDERAQACef/553Lt3r07EX9bKlSvRokWLammhU6up2Dt37gwLCwusXr0aSqUS6enpWLduHSIiImBlZWX28efn50OhUEjKbG1tcePGDVy7dq0aIq++2NPT08VrAEBsbKzkGgAQGRlZpfeevucFqj/+2lJb8atUKmRmZprkNRqjQSUsKpUK06dPR8+ePdG2bVsAQFJSEqytrbXGa3h6eiIpKcno5+jRowcUCgWCg4PRu3dvvPfee9UROoCajf/u3bsYN24c1qxZUyM7fdZk7A4ODvjkk0+wadMm/Pnnn+jVqxeGDx9ebUlLTcZ+9epVXLt2DZs2bcJ3332HNWvW4OjRoxgxYkS1xF7T8WvKy8vD+vXrMWHChKqGLKrJ2AMDA7F9+3a8/fbbsLGxgYuLC27cuIGffvqpTsQfGRmJLVu2ICYmBiqVChcvXsQnn3wCoHiMhbnEfuDAAWzcuBEvvPCCWJaUlARPT0+ta2RkZCA3N7fKsdd0/LWhNuNfvHgxsrKy8OSTT1Zb/DXB0tQB1KaXX34ZZ86cwf79+2vsOTZu3IjMzEycPHkSb7zxBhYvXowZM2ZUy7VrMv6JEyfiqaeewgMPPFDt1wZqNnY3NzdERUWJj7t27Ypbt27h448/xtChQ6t8/ZqMXaVSIT8/H9999x1atGgBAPj222/RuXNnXLhwAS1btqzyc9TG+x4AfvnlF2RmZmLs2LHVds2ajD0pKQkTJ07E2LFjMXr0aGRmZmL27NkYMWIEduzYAZlMVuXnqOnf2StXruDhhx9GYWEhnJycMG3aNMydOxcWFlX/W7Q6Yj9z5gyGDRuGOXPmYODAgVWOyRiM37D4f/jhB8ybNw+//vorPDw8Kv1ctaHBtLBMmTIFf/zxB3bt2oUmTZqI5V5eXigoKEBaWpqkfnJyMry8vIx+Hj8/P7Ru3RqjR4/GokWLMHfuXCiVyqqGX+Px79y5E4sXL4alpSUsLS0xYcIEpKenw9LSEqtWrTLr2HUJCwvD5cuXq3QNoOZj9/b2hqWlpZisAECrVq0AAImJiVULHrX7s1+5ciUefvhhrb+cK6umY1+6dCmcnZ3x0UcfoWPHjnjggQfw/fffIyYmBocOHTL7+GUyGT788ENkZWXh2rVrSEpKEgdrBwUFmTz2c+fOoX///njhhRcwa9YsyTEvLy+tWVHJyclwcnKCra1tlWKvjfhrWm3Fv2HDBjz//PP46aeftLrozFG9T1gEQcCUKVPwyy+/YOfOnQgMDJQc79y5M6ysrBATEyOWXbhwAYmJiQgPD6/Sc6tUKhQWFkKlUlX6GrUVf2xsLE6cOCHe3nvvPTg6OuLEiRN49NFHzTp2XU6cOAFvb+9Kn19bsffs2RNFRUW4cuWKWHbx4kUAgL+/v9nHrxYfH49du3ZVS3dQbcWek5Oj1RIhl8sBoE78zmrG7OvrC2tra/z4448IDw+Hu7u7SWM/e/Ys+vXrh7Fjx+qcoh8eHi65BgDs2LGjyr/3tRV/TanN+H/88UeMHz8eP/74I4YMGVIzL6i6mWq0b22ZNGmS4OzsLOzevVu4ffu2eMvJyRHrvPTSS0LTpk2FnTt3CkeOHBHCw8OF8PBwyXUuXbokHD9+XHjxxReFFi1aCMePHxeOHz8u5OfnC4IgCN9//72wceNG4dy5c8KVK1eEjRs3Cj4+PsLTTz9dJ+IvqzpmCdVW7GvWrBF++OEHIS4uToiLixPef/99wcLCQli1apXZx65UKoVOnToJDzzwgHDs2DHhyJEjQlhYmDBgwIBKx16b8avNmjVL8PHxEYqKiqoUd23GHhMTI8hkMmHevHnCxYsXhaNHjwqRkZGCv7+/5LnMNf7U1FRh2bJlQlxcnHD8+HHhlVdeERQKhXDo0CGTxn769GnB3d1deOaZZyTXSElJEetcvXpVsLOzE9544w0hLi5OWLp0qSCXy4Xo6OhKx16b8QuCIP5/dO7cWXjqqaeE48ePC2fPnq0T8a9fv16wtLQUli5dKqmTlpZWpfhrWr1PWADovK1evVqsk5ubK0yePFlwdXUV7OzshEcffVS4ffu25Dp9+vTReZ34+HhBEARhw4YNQqdOnQQHBwfB3t5eaN26tfDBBx8Iubm5dSL+sqojYamt2NesWSO0atVKsLOzE5ycnIRu3bpJpv2Zc+yCIAg3b94UHnvsMcHBwUHw9PQUxo0bJ9y9e7fOxK9UKoUmTZoIb7/9dpViNkXsP/74o9CxY0fB3t5ecHd3F4YOHSrExcXVifhTU1OF7t27C/b29oKdnZ3Qv39/4eDBgyaPfc6cOTqv4e/vL3muXbt2CaGhoYK1tbUQFBQkeY66EL8hdcw1fn3vrbFjx1Yp/pomEwRBABEREZEZq/djWIiIiKjuY8JCREREZo8JCxEREZk9JixERERk9piwEBERkdljwkJERERmjwkLERERmT0mLERERGT2mLAQERGR2WPCQkRERGaPCQsRERGZvf8DMwE16UniH6cAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#读取sampletarget\n",
    "sample_file = 'SampleTarget1.csv'\n",
    "sample = pd.read_csv(sample_file)\n",
    "\n",
    "#计算每个品种的每日结算数据然后求总pnl总turnover等\n",
    "#三个df分别存放每日结算的pnl、turnover、pnlnet\n",
    "df_pnl = pd.DataFrame()\n",
    "df_turnover = pd.DataFrame()\n",
    "df_pnlnet = pd.DataFrame()\n",
    "df_pnl['trading_day'] = sample['trading_day']\n",
    "df_pnl['timestamp'] = sample['timestamp']\n",
    "df_turnover['trading_day'] = sample['trading_day']\n",
    "df_turnover['timestamp'] = sample['timestamp']\n",
    "df_pnlnet['trading_day'] = sample['trading_day']\n",
    "df_pnlnet['timestamp'] = sample['timestamp']\n",
    "for i in range(2,len(sample.columns)):\n",
    "    ft_x = sample.columns[i]\n",
    "    df_pnl,df_pnlnet,df_turnover = daily_data(ft_x,df_dict,sample,df_pnl,df_turnover,df_pnlnet)\n",
    "\n",
    "\n",
    "#全品种总体指标计算\n",
    "df_pnl['sum'] = df_pnl.apply(lambda x:sum(x[2:].dropna()),axis = 1)\n",
    "df_pnl['cumsum'] = np.cumsum(df_pnl['sum'])\n",
    "df_turnover['sum'] = df_turnover.apply(lambda x:sum(x[2:].dropna()),axis = 1)\n",
    "df_pnlnet['sum'] = df_pnlnet.apply(lambda x:sum(x[2:].dropna()),axis = 1)\n",
    "df_pnlnet['cumsum'] = np.cumsum(df_pnlnet['sum'])\n",
    "df_pnl['trading_day'] = df_pnl.apply(lambda x: pd.to_datetime(str(int(x[0]))),axis = 1)\n",
    "df_turnover['trading_day'] = df_turnover.apply(lambda x: pd.to_datetime(str(int(x[0]))),axis = 1)\n",
    "df_pnlnet['trading_day'] = df_pnlnet.apply(lambda x: pd.to_datetime(str(int(x[0]))),axis = 1)\n",
    "\n",
    "#判断单位\n",
    "if df_pnl.iloc[-1,-1]>10000:\n",
    "    unit = 1000000\n",
    "else:\n",
    "    unit = 1\n",
    "#根据单位调整每日结算数据\n",
    "df_pnl.iloc[:,2:] = df_pnl.iloc[:,2:]/unit\n",
    "df_turnover.iloc[:,2:] = df_turnover.iloc[:,2:]/unit\n",
    "df_pnlnet.iloc[:,2:] = df_pnlnet.iloc[:,2:]/unit\n",
    "\n",
    "#总体指标：\n",
    "SharpRatio = np.mean(df_pnlnet['sum'])/np.std(df_pnlnet['sum'])*15.8\n",
    "TurnOver = np.mean(df_turnover['sum'])                    #df_turnover单位已经为100w，所以不用除以100w\n",
    "AvgLeverage = np.mean(sample.apply(lambda x:sum(x[2:].dropna()),axis = 1))/unit   #分母为单位（1/100w）\n",
    "#画图\n",
    "plt.figure()\n",
    "plt.plot(df_pnlnet['trading_day'],df_pnlnet['cumsum'],label = 'pnl_net')\n",
    "plt.title(\n",
    "    \"SharpRatio : {:.2f}, TurnOver : {:.2f}, AvgLeverage : {:.2f}\".format(SharpRatio, TurnOver, AvgLeverage))\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.6 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "f5ff168696553f3e2cb115c273c46eeb315c32b0d0536992c4bad2740a7f9469"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
